package es.ucm.fdi.healthpred.vista;

import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

import org.eclipse.wb.swing.FocusTraversalOnArray;

import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.layout.Sizes;
import com.toedter.calendar.JDateChooser;
import com.toedter.calendar.JYearChooser;

import es.ucm.fdi.healthpred.controlador.Controlador;
import es.ucm.fdi.healthpred.controlador.excepciones.ExcepcionCapturaDatos;
import es.ucm.fdi.healthpred.controlador.utils.ConstantsString;
import es.ucm.fdi.healthpred.controlador.utils.StringsHP_BD;
import es.ucm.fdi.healthpred.modelo.beans.DatosProfesionales;
import es.ucm.fdi.healthpred.modelo.beans.DatosSociales;
import es.ucm.fdi.healthpred.modelo.beans.Estudios;
import es.ucm.fdi.healthpred.modelo.beans.HechoClinico;
import es.ucm.fdi.healthpred.modelo.beans.Historial;
import es.ucm.fdi.healthpred.modelo.beans.HistorialId;
import es.ucm.fdi.healthpred.modelo.beans.Hobbie;
import es.ucm.fdi.healthpred.modelo.beans.HobbieId;
import es.ucm.fdi.healthpred.modelo.beans.Persona;
import es.ucm.fdi.healthpred.modelo.beans.Residencia;

/**
 * Formulario que permite ver, editar, consultar/inferir o crear un cliente.
 * 
 * @since 1.0
 * 
 * @version 1.0
 * 
 * @author &Aacute;lvaro G&oacute;mez Porris
 * @author V&iacute;ctor L&oacute;pez Monte
 * @author Carlos Rodr&iacute;guez Colliga
 * 
 */
public class FormSecundario extends JDialog {

	private static final int alto = 660;
	private static final int ancho = 1020;
	private static final Color colorDisabled = new Color(60, 60, 60);
	private static final int MIN_FILAS_TABLA = 9;

	private static final long serialVersionUID = 1L;

	private SimpleAttributeSet attrs = new SimpleAttributeSet();
	private JToolBar barraOpciones = new JToolBar();
	private JButton btnAlimento;
	private JButton btnGuardar;
	private JButton btnHigiene;
	private JButton btnOpcion1;
	private JButton btnOpcion2 = null;
	private JButton btnPerjudicial;
	private JButton btnResidencia;
	private JButton btnTrabajo;
	private JCheckBox chkAlimento;
	private JCheckBox chkHigiene;
	private JCheckBox chkPerjudicial;
	private JCheckBox chkResidencia;
	private JCheckBox chkTrabajo;
	private JComboBox<String> cmbCentro;
	private JComboBox<String> cmbContrato;
	private JComboBox<String> cmbEmpleo;
	private JComboBox<String> cmbEstado;
	private JComboBox<String> cmbEstadoCivil;
	private JComboBox<String> cmbHijos;
	private JComboBox<String> cmbHijosMen;
	private JComboBox<String> cmbHorario;
	private JComboBox<String> cmbNivel;
	private JComboBox<String> cmbProvincia;
	private JComboBox<String> cmbProvincia2;
	private JComboBox<String> cmbSalario;
	private JComboBox<String> cmbTipoResidencia;
	private JComboBox<String> cmbZona;
	private JYearChooser dateFin;
	private JDateChooser dateFNac;
	private HashMap<String, Object> datos_alimenticios = null;
	private HashMap<String, Object> datos_higienicos = null;
	private HashMap<String, Object> datos_perjudiciales = null;
	private HashMap<String, Object> datos_residencia = null;
	private HashMap<String, Object> datos_trabajo = null;
	private DatosCliente datosCliente = new DatosCliente();
	private ButtonGroup grupoEmancipado = new ButtonGroup();
	private ButtonGroup grupoSexo = new ButtonGroup();
	private ModoConsulta modoConsulta = ModoConsulta.M_AUTO;
	private ModoFormSecundario modoFormulario;
	private ModoListaSecundario modoLista = ModoListaSecundario.L_HISTORIAL;
	private int nivelInferencia = 1;
	private JPanel panelCentral = new JPanel();
	private JTextPaneClonable panelLog = new JTextPaneClonable();
	private JPopupMenu popupMenu = new JPopupMenu();
	private JRadioButton rdAuto = null;
	private JRadioButton rdbtnHombre = null;
	private JRadioButton rdbtnMujer = null;
	private JRadioButton rdbtnNo = null;
	private JRadioButton rdbtnSi = null;
	private JRadioButton rdParam = null;
	private JRadioButton rdParamValor = null;
	private JScrollPane scrollPane = new JScrollPane();
	private JTable tabla;
	private JToolBar toolBar = new JToolBar();
	private JTextFieldDigitosFoco txtAnyos = null;
	private JTextFieldFoco txtApellido1 = null;
	private JTextFieldFoco txtApellido2 = null;
	private JTextFieldFoco txtCentro = null;
	private JTextFieldFoco txtContrato = null;
	private JTextFieldDigitosFoco txtCoste = null;
	private JTextFieldFoco txtDireccion = null;
	private JTextFieldFoco txtDNI = null;
	private JTextFieldFoco txtEmpleo = null;
	private JTextFieldFoco txtEstadoCivil = null;
	private JTextFieldFoco txtEstadoTrabajo = null;
	private JTextFieldFoco txtEstudio = null;
	private JTextFieldFoco txtFin = null;
	private JTextFieldFoco txtFNac = null;
	private JTextFieldFoco txtHijos = null;
	private JTextFieldFoco txtHijosMen = null;
	private JTextFieldFoco txtHorario = null;
	private JTextFieldFoco txtLocalidad = null;
	private JTextFieldFoco txtMunicipio = null;
	private JTextFieldFoco txtNivel = null;
	private JTextFieldFoco txtNombre = null;
	private JTextFieldFoco txtProvincia = null;
	private JTextFieldFoco txtProvincia2 = null;
	private JTextFieldFoco txtPuesto = null;
	private JTextFieldFoco txtSalario = null;
	private JTextFieldDigitosFoco txtTelf = null;
	private JTextFieldFoco txtTipoResidencia = null;
	private JTextFieldFoco txtZona = null;

	/**
	 * @param padre
	 * @param modo
	 */
	public FormSecundario(JFrame padre, ModoFormSecundario modo) {
		super(padre, true);
		modoFormulario = modo;
		init();
	}

	/**
	 * Obtiene los datos del formulario de <i>Alimento</i>.
	 */
	public void actualizaDatosAlimenticios() {
		datos_alimenticios = new HashMap<String, Object>();
		datos_alimenticios = Controlador.vistaParamAlimento
				.obtenerDatosFormAlimenticios();
	}

	/**
	 * Obtiene los datos del formulario de <i>Higiene</i>.
	 */
	public void actualizaDatosHigienicos() {
		datos_higienicos = new HashMap<String, Object>();
		datos_higienicos = Controlador.vistaParamHigiene
				.obtenerDatosFormHigienicos();
	}

	/**
	 * Obtiene los datos del formulario de <i>Perjudiciales</i>.
	 */
	public void actualizaDatosPerjudiciales() {
		datos_perjudiciales = new HashMap<String, Object>();
		datos_perjudiciales = Controlador.vistaParamPerjudicial
				.obtenerDatosFormPerjudiciales();
	}

	/**
	 * Obtiene los datos del formulario de <i>Residencia</i>.
	 */
	public void actualizaDatosResidencia() {
		datos_residencia = new HashMap<String, Object>();
		datos_residencia = Controlador.vistaParamResidencia
				.obtenerDatosFormResidencia();
	}

	/**
	 * Obtiene los datos del formulario de <i>Trabajo</i>.
	 */
	public void actualizaDatosTrabajo() {
		datos_trabajo = new HashMap<String, Object>();
		datos_trabajo = Controlador.vistaParamTrabajo.obtenerDatosFormTrabajo();
	}

	/**
	 * @param historia
	 *            Los nuevos datos.
	 */
	public void actualizaHistoria(Historial historia) {
		int pos = eliminaHistoria();
		nuevaHistoria(pos, historia);
	}

	/**
	 * @param hobbie
	 *            Los nuevos datos.
	 */
	public void actualizaHobbie(Hobbie hobbie) {
		int pos = eliminaHobbie();
		nuevoHobbie(pos, hobbie);
	}

	/**
	 * Actualiza la tabla (excepto en modo <i>consultar</i>, que no aparece).
	 */
	public void actualizaTabla() {
		Historial historia;
		HechoClinico hecho;
		Hobbie hobbie;
		DefaultTableModel modelo = (DefaultTableModel) tabla.getModel();
		int filasAntes = modelo.getRowCount();
		int total = 0;

		// limpiamos la tabla
		for (int i = 0; i < filasAntes; i++) {
			modelo.removeRow(0);
		}

		if (modoLista == ModoListaSecundario.L_HOBBIE) {
			total = datosCliente.getHobbies().size();
			for (int i = 0; i < total; i++) {
				hobbie = (Hobbie) datosCliente.getHobbies().get(i);
				modelo.addRow(new String[] { hobbie.getId().getNombre(),
						hobbie.getTipo(),
						StringsHP_BD.categoriaHobbieHP(hobbie.getCategoria()),
						String.valueOf(hobbie.getFrecuenciaSemanal()),
						String.valueOf(hobbie.getDuracion()),
						String.valueOf(hobbie.getCosteAnual()) });
			}
			if (total < MIN_FILAS_TABLA) {
				for (int i = 0; i < (MIN_FILAS_TABLA - total); i++) {
					modelo.addRow(new String[] { null, null, null, null, null,
							null });
				}
			}
		} else {
			total = datosCliente.getHistorial().size();
			for (int i = 0; i < total; i++) {
				historia = (Historial) datosCliente.getHistorial().get(i);
				hecho = historia.getHechoClinico();
				modelo.addRow(new String[] {
						StringsHP_BD.tipoHechoHP(hecho.getTipo()),
						StringsHP_BD.sistemaHechoHP(hecho.getSistema()),
						StringsHP_BD.descripcionHechoHP(hecho.getDescripcion()),
						historia.getProcedencia(), historia.getFecha(),
						String.valueOf(historia.getDuracion()),
						historia.getEstado() });
			}
			if (total < MIN_FILAS_TABLA) {
				for (int i = 0; i < (MIN_FILAS_TABLA - total); i++) {
					modelo.addRow(new String[] { null, null, null, null, null,
							null, null });
				}
			}
		}
		repaint();
	}

	/**
	 * Marca la historia actual para ser eliminada de la BD.
	 */
	public int eliminaHistoria() {
		for (int i = 0; i < datosCliente.getHistorial().size(); i++) {
			Historial h = (Historial) datosCliente.getHistorial().get(i);
			if (Integer.valueOf(h.getId().getCodigo()) == Controlador.codigoHecho) {
				if ((modoFormulario == ModoFormSecundario.M_EDITAR)
						&& (datosCliente.getHistorialBD().get(i))) {
					Controlador.historiasDelete.add(Controlador.codigoHecho);
				}
				datosCliente.getHistorial().remove(h);
				datosCliente.getHistorialBD().remove(i);
				return i;
			}
		}
		return -1;
	}

	/**
	 * Marca el heho actual para ser eliminado de la BD.
	 */
	public int eliminaHobbie() {
		for (int i = 0; i < datosCliente.getHobbies().size(); i++) {
			Hobbie h = (Hobbie) datosCliente.getHobbies().get(i);
			if (h.getId().getNombre()
					.equalsIgnoreCase(Controlador.nombreHobbie)) {
				if ((modoFormulario == ModoFormSecundario.M_EDITAR)
						&& (datosCliente.getHobbiesBD().get(i))) {
					Controlador.hobbiesDelete.add(Controlador.nombreHobbie);
				}
				datosCliente.getHobbies().remove(h);
				datosCliente.getHobbiesBD().remove(i);
				return i;
			}
		}
		return -1;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbCentro() {
		return cmbCentro;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbContrato() {
		return cmbContrato;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbEmpleo() {
		return cmbEmpleo;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbEstado() {
		return cmbEstado;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbEstadoCivil() {
		return cmbEstadoCivil;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbHijos() {
		return cmbHijos;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbHijosMen() {
		return cmbHijosMen;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbHorario() {
		return cmbHorario;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbNivel() {
		return cmbNivel;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbProvincia() {
		return cmbProvincia;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbProvincia2() {
		return cmbProvincia2;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbSalario() {
		return cmbSalario;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbTipoResidencia() {
		return cmbTipoResidencia;
	}

	/**
	 * @return
	 */
	public JComboBox<String> getCmbZona() {
		return cmbZona;
	}

	/**
	 * @return
	 */
	public JYearChooser getDateFin() {
		return dateFin;
	}

	/**
	 * @return
	 */
	public JDateChooser getDateFNac() {
		return dateFNac;
	}

	/**
	 * @return the datos
	 */
	public DatosCliente getDatosCliente() {
		return datosCliente;
	}

	/**
	 * @return the modoFormulario
	 */
	public ModoFormSecundario getModo() {
		return modoFormulario;
	}

	/**
	 * @return the modoConsulta
	 */
	public ModoConsulta getModoConsulta() {
		return modoConsulta;
	}

	/**
	 * @return the nivelInferencia
	 */
	public int getNivelInferencia() {
		return nivelInferencia;
	}

	/**
	 * @return the panelCentral
	 */
	public JPanel getPanelCentral() {
		return panelCentral;
	}

	/**
	 * @return the panelLog
	 */
	public JTextPaneClonable getPanelLog() {
		return panelLog;
	}

	/**
	 * @return
	 */
	public JRadioButton getRdbtnHombre() {
		return rdbtnHombre;
	}

	/**
	 * @return
	 */
	public JRadioButton getRdbtnMujer() {
		return rdbtnMujer;
	}

	/**
	 * @return
	 */
	public JRadioButton getRdbtnNo() {
		return rdbtnNo;
	}

	/**
	 * @return
	 */
	public JRadioButton getRdbtnSi() {
		return rdbtnSi;
	}

	/**
	 * @return the scrollPan
	 */
	public JScrollPane getScrollPane() {
		return scrollPane;
	}

	/**
	 * @return the tabla
	 */
	public JTable getTabla() {
		return tabla;
	}

	public String getTextoPanelLog() {
		return panelLog.getText();
	}

	/**
	 * @return the toolBar
	 */
	public JToolBar getToolBar() {
		return toolBar;
	}

	/**
	 * @return
	 */
	public JTextFieldDigitosFoco getTxtAnyos() {
		return txtAnyos;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtApellido1() {
		return txtApellido1;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtApellido2() {
		return txtApellido2;
	}

	/**
	 * @return
	 */
	public JTextFieldDigitosFoco getTxtCoste() {
		return txtCoste;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtDireccion() {
		return txtDireccion;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtDNI() {
		return txtDNI;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtEstudio() {
		return txtEstudio;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtLocalidad() {
		return txtLocalidad;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtMunicipio() {
		return txtMunicipio;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtNombre() {
		return txtNombre;
	}

	/**
	 * @return
	 */
	public JTextFieldFoco getTxtPuesto() {
		return txtPuesto;
	}

	/**
	 * @return
	 */
	public JTextFieldDigitosFoco getTxtTelf() {
		return txtTelf;
	}

	/**
	 * Habilita la opci&oacute;n para desplegar un formulario con los resultados
	 * de la inferencia.
	 */
	public void habilitaDesplegar() {
		if (modoFormulario == ModoFormSecundario.M_CONSULTAR) {
			btnOpcion2.setEnabled(true);
		}
	}

	/**
	 * Imprime los resultados pasados como argumento seg&uacute;n el nivel de
	 * inferencia actual.
	 * 
	 * @param vArgs
	 */
	public void imprimeResultadoLog(ArrayList<String> vArgs) {
		switch (nivelInferencia) {
		case 1:
			StyleConstants.setBold(attrs, true);
			StyleConstants.setUnderline(attrs, true);
			insertaTextoPanelLog("1. PERFILES ", attrs);
			StyleConstants.setUnderline(attrs, false);
			StyleConstants.setBold(attrs, false);
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();
			StyleConstants.setItalic(attrs, true);
			insertaTextoPanelLog("1.1 PERFIL PERSONAL", attrs);
			StyleConstants.setItalic(attrs, false);
			insertaNuevaLineaPanelLog();
			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- CATEGOR\u00cdA SOCIAL: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(0), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- CATEGOR\u00cdA ECON\u00d3MICA: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(1), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- CATEGOR\u00cdA CULTURAL: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(2), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- CATEGOR\u00cdA PROFESIONAL: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(3), attrs);
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();

			StyleConstants.setItalic(attrs, true);
			insertaTextoPanelLog("1.2 PERFIL CL\u00cdNICO", attrs);
			StyleConstants.setItalic(attrs, false);
			insertaNuevaLineaPanelLog();
			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA MUSCULAR: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(4), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA \u00d3SEO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(5), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA ARTICULAR: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(6), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA NERVIOSO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(7), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA DIGESTIVO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(8), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA EXCRETOR: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(9), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA TEGUMENTARIO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(10), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA INMUNITARIO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(11), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA REPRODUCTOR: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(12), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA RESPIRATORIO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(13), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA CARDIOVASCULAR: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(14), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- SISTEMA LINF\u00c1TICO: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(15), attrs);
			insertaNuevaLineaPanelLog();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("- ESTADO MENTAL: ", attrs);
			StyleConstants.setBold(attrs, false);
			insertaTextoPanelLog(vArgs.get(16), attrs);

			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();
			break;
		case 2:
			inhabilitaParams();

			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog(
					"-------- PAR\u00c1METROS Y VALORES DE LA CONSULTA --------",
					attrs);
			StyleConstants.setBold(attrs, false);
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();
			String cadenaFinP = "FinParams";
			String param = null;
			int i = 0;
			while (!vArgs.get(i).equals(cadenaFinP)) {
				StyleConstants.setBold(attrs, true);
				param = "\t- ";
				switch (i) {
				case 0:
				case 5:
					if (i == 0) {
						insertaTextoPanelLog("- CONDICIONES DE RESIDENCIA: ",
								attrs);
					} else {
						insertaTextoPanelLog("- CONDICIONES DE TRABAJO: ",
								attrs);
					}
					insertaNuevaLineaPanelLog();
					param += "Temperatura media: ";
					break;
				case 1:
				case 6:
					param += "Humedad: ";
					break;
				case 2:
				case 7:
					param += "Horas de sol al d\u00eda: ";
					break;
				case 3:
				case 8:
					param += "Calidad del aire: ";
					break;
				case 4:
				case 9:
					param += "Contaminaci\u00f3n ac\u00fastica: ";
					break;
				case 10:
					param += "Vertidos: ";
					break;
				case 11:
					param += "Esfuerzo f\u00edsico: ";
					break;
				case 12:
					insertaTextoPanelLog("- H\u00c1BITOS ALIMENTICIOS:", attrs);
					insertaNuevaLineaPanelLog();
					param += "Consumo de cereales/f\u00e9culas: ";
					break;
				case 13:
					param += "Consumo de frutas/verduras: ";
					break;
				case 14:
					param += "Consumo de grasas/l\u00edpidos: ";
					break;
				case 15:
					param += "Consumo de carne: ";
					break;
				case 16:
					param += "Consumo de pescado: ";
					break;
				case 17:
					param += "Consumo de l\u00e1cteos/huevos: ";
					break;
				case 18:
					param += "Consumo de agua: ";
					break;
				case 19:
					param += "N\u00famero de comidas al d\u00eda: ";
					break;
				case 20:
					insertaTextoPanelLog("- H\u00c1BITOS HIGI\u00c9NICOS:",
							attrs);
					insertaNuevaLineaPanelLog();
					param += "Higiene corporal: ";
					break;
				case 21:
					param += "Higiene bucal: ";
					break;
				case 22:
					param += "Higiene de vestimenta: ";
					break;
				case 23:
					param += "Higiene alimentaria: ";
					break;
				case 24:
					param += "Higiene de vivienda: ";
					break;
				case 25:
					insertaTextoPanelLog("- H\u00c1BITOS PERJUDICIALES:", attrs);
					insertaNuevaLineaPanelLog();
					param += "T\u00f3xicos: ";
					break;
				case 26:
					param += "Sedentarismo: ";
					break;
				case 27:
					param += "Defectos posturales: ";
					break;
				case 28:
					param += "Nivel de estr\u00e9s: ";
					break;
				case 29:
					param += "Horas de sue\u00f1o al d\u00eda: ";
				}
				insertaTextoPanelLog(param, attrs);
				StyleConstants.setBold(attrs, false);
				if ((i == 10) || (i == 11) || (i == 26) || (i == 27)) {
					insertaTextoPanelLog(StringsHP_BD.siNoHP(vArgs.get(i)),
							attrs);
				} else if (i == 25) {
					insertaTextoPanelLog(StringsHP_BD.toxicosHP(vArgs.get(i)),
							attrs);
				} else {
					insertaTextoPanelLog(vArgs.get(i), attrs);
				}
				insertaNuevaLineaPanelLog();
				i++;
			}

			insertaNuevaLineaPanelLog();
			StyleConstants.setBold(attrs, true);
			insertaTextoPanelLog("-------- INFORME DE RESULTADOS --------",
					attrs);
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();

			StyleConstants.setUnderline(attrs, true);
			insertaTextoPanelLog("2. S\u00cdNTOMAS", attrs);
			StyleConstants.setBold(attrs, false);
			StyleConstants.setUnderline(attrs, false);
			insertaNuevaLineaPanelLog();
			String cadenaFin = "Fin2";
			i++;
			while (!vArgs.get(i).equals(cadenaFin)) {
				insertaTextoPanelLog("- " + vArgs.get(i), attrs);
				insertaNuevaLineaPanelLog();
				i++;
			}
			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();

			break;
		case 3:
			StyleConstants.setBold(attrs, true);
			StyleConstants.setUnderline(attrs, true);
			insertaTextoPanelLog("3. PATOLOG\u00cdAS", attrs);
			StyleConstants.setUnderline(attrs, false);
			cadenaFin = "Fin3";
			i = 0;
			while (!vArgs.get(i).equals(cadenaFin)) {
				StyleConstants.setBold(attrs, true);
				switch (i % 4) {
				case 0:
					insertaNuevaLineaPanelLog();
					insertaTextoPanelLog(
							"- HECHO CL\u00cdNICO "
									+ String.valueOf((i / 4) + 1) + ": ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 1:
					insertaTextoPanelLog("\t- ESTADO: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 2:
					insertaTextoPanelLog("\t- GRAVEDAD: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 3:
					insertaTextoPanelLog("\t- COSTE TRATAMIENTO: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
				}
				i++;
			}
			StyleConstants.setBold(attrs, false);

			insertaNuevaLineaPanelLog();
			insertaNuevaLineaPanelLog();
			break;
		case 4:
			btnOpcion1.setEnabled(false);
			btnGuardar.setEnabled(true);
			StyleConstants.setBold(attrs, true);
			StyleConstants.setUnderline(attrs, true);
			insertaTextoPanelLog("4. CONCLUSIONES FINALES", attrs);
			StyleConstants.setUnderline(attrs, false);
			cadenaFin = "Fin4";
			i = 0;
			while (!vArgs.get(i).equals(cadenaFin)) {
				StyleConstants.setBold(attrs, true);
				switch (i % 4) {
				case 0:
					insertaNuevaLineaPanelLog();
					insertaTextoPanelLog(
							"- HECHO CL\u00cdNICO "
									+ String.valueOf((i / 4) + 1) + ": ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 1:
					insertaTextoPanelLog("\t- CONCLUSI\u00d3N: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 2:
					insertaTextoPanelLog("\t- TIEMPO DE CURACI\u00d3N: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
					break;
				case 3:
					insertaTextoPanelLog("\t- PROBABILIDAD: ", attrs);
					StyleConstants.setBold(attrs, false);
					insertaTextoPanelLog(vArgs.get(i), attrs);
					insertaNuevaLineaPanelLog();
				}
				i++;
			}
		}
		nivelInferencia++;
	}

	/**
	 * Agrega una historia en la posici&oacute;n indicada. Si es negativa lo
	 * hace al final.
	 * 
	 * @param pos
	 * @param historia
	 */
	public void nuevaHistoria(int pos, Historial historia) {
		if (pos > -1) {
			datosCliente.getHistorial().add(pos, historia);
			datosCliente.getHistorialBD().add(pos, false);
		} else {
			datosCliente.getHistorial().add(historia);
			datosCliente.getHistorialBD().add(false);
		}
	}

	/**
	 * Agrega un hobbie en la posici&oacute;n indicada. Si es negativa lo hace
	 * al final.
	 * 
	 * @param pos
	 * @param hobbie
	 */
	public void nuevoHobbie(int pos, Hobbie hobbie) {
		if (pos > -1) {
			datosCliente.getHobbies().add(pos, hobbie);
			datosCliente.getHobbiesBD().add(pos, false);
		} else {
			datosCliente.getHobbies().add(hobbie);
			datosCliente.getHobbiesBD().add(false);
		}
	}

	/**
	 * @return Los datos para la inferencia.
	 */
	public HashMap<String, Object> obtenerCamposInferencia() {
		HashMap<String, Object> datos = new HashMap<String, Object>();
		reiniciaVariables(datos);
		if (rdAuto.isSelected()) {
			randomAlim(datos);
			randomHig(datos);
			randomPer(datos);
			randomConR(datos);
			randomConT(datos);
		} else if (rdParam.isSelected()) {
			if (chkResidencia.isSelected()) {
				randomConR(datos);
			}
			if (chkTrabajo.isSelected()) {
				randomConT(datos);
			}
			if (chkAlimento.isSelected()) {
				randomAlim(datos);
			}
			if (chkHigiene.isSelected()) {
				randomHig(datos);
			}
			if (chkPerjudicial.isSelected()) {
				randomPer(datos);
			}
		} else if (rdParamValor.isSelected()) {
			if (!chkResidencia.isSelected()) {
				randomConR(datos);
			} else {
				datos = obtenerDatosResidencia(datos);
			}
			if (!chkTrabajo.isSelected()) {
				randomConT(datos);
			} else {
				datos = obtenerDatosCHKTrabajo(datos);
			}
			if (!chkAlimento.isSelected()) {
				randomAlim(datos);
			} else {
				datos = obtenerDatosCHKAlimenticios(datos);
			}
			if (!chkHigiene.isSelected()) {
				randomHig(datos);
			} else {
				datos = obtenerDatosCHKHigienicos(datos);
			}
			if (!chkPerjudicial.isSelected()) {
				randomPer(datos);
			} else {
				datos = obtenerDatosCHKPerjudiciales(datos);
			}
		}
		return datos;
	}

	/**
	 * Obtienes los datos relativos al cliente desde el formulario. 
	 */
	public void obtenerDatosCliente() {
		Persona persona = new Persona();
		Residencia residencia = new Residencia();
		DatosSociales datosSociales = new DatosSociales();
		Estudios estudios = new Estudios();
		DatosProfesionales datosProfesionales = new DatosProfesionales();

		persona.setDni(txtDNI.getText());
		persona.setNombre(txtNombre.getText());
		persona.setApellido1(txtApellido1.getText());
		persona.setApellido2(txtApellido2.getText());
		persona.setTelefono(Integer.valueOf(txtTelf.getText()));
		persona.setFechaNacimiento(dateFNac.getDate());
		persona.setLocalidad(txtLocalidad.getText());
		persona.setProvincia(StringsHP_BD.provinciaBD(cmbProvincia
				.getSelectedItem().toString()));
		if (rdbtnHombre.getSelectedObjects() != null) {
			persona.setSexo(ConstantsString.HOMBRE);
		} else {
			persona.setSexo(ConstantsString.MUJER);
		}

		residencia.setDni(txtDNI.getText());
		residencia.setPersona(persona);
		residencia.setDireccion(txtDireccion.getText());
		residencia.setMunicipio(txtMunicipio.getText());
		residencia.setProvincia(StringsHP_BD.provinciaBD(cmbProvincia2
				.getSelectedItem().toString()));
		residencia.setTipoResidencia(StringsHP_BD
				.tipoResidenciaBD(cmbTipoResidencia.getSelectedItem()
						.toString()));
		residencia.setTipoContrato(StringsHP_BD.tipoContratoBD(cmbContrato
				.getSelectedItem().toString()));
		residencia.setCosteMes(Integer.valueOf(txtCoste.getText()));
		residencia.setZona(cmbZona.getSelectedItem().toString());
		if (rdbtnSi.getSelectedObjects() != null) {
			residencia.setEmancipado(ConstantsString.SI);
		} else if (rdbtnNo.getSelectedObjects() != null) {
			residencia.setEmancipado(ConstantsString.NO);
		}
		persona.setResidencia(residencia);

		datosSociales.setDni(txtDNI.getText());
		datosSociales.setPersona(persona);
		datosSociales.setEstadoCivil(cmbEstadoCivil.getSelectedItem()
				.toString());
		datosSociales.setNumHijos(StringsHP_BD.numHijosBD(cmbHijos
				.getSelectedItem().toString()));
		datosSociales.setNumHijosMenores(StringsHP_BD.numHijosBD(cmbHijosMen
				.getSelectedItem().toString()));
		persona.setDatosSociales(datosSociales);

		estudios.setDni(txtDNI.getText());
		estudios.setPersona(persona);
		estudios.setNivelMaximo(StringsHP_BD.nivelEstudiosBD(cmbNivel
				.getSelectedItem().toString()));
		estudios.setEstudio(txtEstudio.getText());
		estudios.setCentro(StringsHP_BD.tipoCentroBD(cmbCentro
				.getSelectedItem().toString()));
		estudios.setFechaFin(String.valueOf(dateFin.getYear()));
		persona.setEstudios(estudios);

		datosProfesionales.setDni(txtDNI.getText());
		datosProfesionales.setPersona(persona);
		datosProfesionales.setEstado(cmbEstado.getSelectedItem().toString());
		datosProfesionales.setPuesto(txtPuesto.getText());
		datosProfesionales.setTipoEmpresa(StringsHP_BD.tipoEmpresaBD(cmbEmpleo
				.getSelectedItem().toString()));
		datosProfesionales.setAnyosTrabajados(Integer.valueOf(txtAnyos
				.getText()));
		datosProfesionales.setSalarioAnual(StringsHP_BD.salarioBD(cmbSalario
				.getSelectedItem().toString()));
		datosProfesionales.setHorario(StringsHP_BD.horarioBD(cmbHorario
				.getSelectedItem().toString()));
		persona.setDatosProfesionales(datosProfesionales);

		datosCliente.setPersona(persona);
	}

	/**
	 * @return Random entre "Nulo", "Bajo", "Medio" y "Alto".
	 */
	public String randomBMA() {
		Random rand = new Random();
		int x = rand.nextInt(3);
		String aux = null;

		if (x == 0)
			aux = "Nulo";
		if (x == 1)
			aux = "Bajo";
		else if (x == 2)
			aux = "Medio";
		else if (x == 3)
			aux = "Alto";
		else
			aux = "Medio";
		return aux;

	}

	/**
	 * @return Un entero entre 0 y 11 inclusives.
	 */
	public Integer randomH() {
		Random rand = new Random();
		int x = rand.nextInt(12);
		while (x < 5)
			x = rand.nextInt(12);

		return x;
	}

	/**
	 * @return Un random entre "Si" o "No".
	 */
	public String randomSN() {
		Random rand = new Random();
		int x = rand.nextInt(2);
		String aux = null;

		if (x == 0)
			aux = "No";
		else if (x == 1)
			aux = "Si";
		else
			aux = "No";
		return aux;

	}

	/**
	 * @return Un random de los tipos de t&oacute;xicos.
	 */
	public String randomT() {
		Random rand = new Random();
		int x = rand.nextInt(8);
		String aux = null;

		if (x == 0)
			aux = "Ninguno";
		else if (x == 1)
			aux = "Alcohol";
		else if (x == 2)
			aux = "Tabaco";
		else if (x == 3)
			aux = "Drogas";
		else if (x == 4)
			aux = "Alcohol_y_tabaco";
		else if (x == 5)
			aux = "Alcohol_y_drogas";
		else if (x == 6)
			aux = "Tabaco_y_drogas";
		else if (x == 7)
			aux = "Todos";
		else
			aux = "Ninguno";
		return aux;

	}

	/**
	 * @return Un enterpo entre 15 y 29
	 */
	public Integer randomTEMP() {
		Random rand = new Random();
		int x = rand.nextInt(30);
		while (x < 15)
			x = rand.nextInt(30);
		return x;
	}

	/**
	 * Rellena los datos de un cliente en el formulario.
	 */
	public void rellenaCampos() {
		Persona persona = datosCliente.getPersona();
		rellenaDatosPersonales();
		txtDireccion.setText(persona.getResidencia().getDireccion());
		txtMunicipio.setText(persona.getResidencia().getMunicipio());
		txtCoste.setText(String.valueOf(persona.getResidencia().getCosteMes()));
		txtEstudio.setText(persona.getEstudios().getEstudio());
		txtAnyos.setText(String.valueOf(persona.getDatosProfesionales()
				.getAnyosTrabajados()));
		txtPuesto.setText(persona.getDatosProfesionales().getPuesto());

		if (persona.getResidencia().getEmancipado().equals(ConstantsString.SI)) {
			rdbtnSi.setSelected(true);
			rdbtnNo.setSelected(false);
		} else if (persona.getResidencia().getEmancipado()
				.equals(ConstantsString.NO)) {
			rdbtnSi.setSelected(false);
			rdbtnNo.setSelected(true);
		} else {
			rdbtnSi.setSelected(false);
			rdbtnNo.setSelected(false);
		}

		if (modoFormulario.equals(ModoFormSecundario.M_VER)) {
			txtDireccion.setToolTipText(txtDireccion.getText());
			txtMunicipio.setToolTipText(txtMunicipio.getText());
			txtCoste.setToolTipText(txtCoste.getText());
			txtEstudio.setToolTipText(txtEstudio.getText());
			txtAnyos.setToolTipText(txtAnyos.getText());
			txtPuesto.setToolTipText(txtPuesto.getText());
			txtProvincia2.setText(StringsHP_BD.provinciaHP(persona
					.getResidencia().getProvincia()));
			txtProvincia2.setToolTipText(txtProvincia2.getText());
			txtTipoResidencia.setText(StringsHP_BD.tipoResidenciaHP(persona
					.getResidencia().getTipoResidencia()));
			txtTipoResidencia.setToolTipText(txtTipoResidencia.getText());
			txtContrato.setText(StringsHP_BD.tipoContratoHP(persona
					.getResidencia().getTipoContrato()));
			txtContrato.setToolTipText(txtContrato.getText());
			txtZona.setText(persona.getResidencia().getZona());
			txtZona.setToolTipText(txtZona.getText());
			txtEstadoCivil.setText(persona.getDatosSociales().getEstadoCivil());
			txtEstadoCivil.setToolTipText(txtEstadoCivil.getText());
			txtHijos.setText(StringsHP_BD.numHijosHP(persona.getDatosSociales()
					.getNumHijos()));
			txtHijos.setToolTipText(txtHijos.getText());
			txtHijosMen.setText(StringsHP_BD.numHijosHP(persona
					.getDatosSociales().getNumHijosMenores()));
			txtHijosMen.setToolTipText(txtHijosMen.getText());
			txtNivel.setText(StringsHP_BD.nivelEstudiosHP(persona.getEstudios()
					.getNivelMaximo()));
			txtNivel.setToolTipText(txtNivel.getText());
			txtCentro.setText(StringsHP_BD.tipoCentroHP(persona.getEstudios()
					.getCentro()));
			txtCentro.setToolTipText(txtCentro.getText());
			txtFin.setText(persona.getEstudios().getFechaFin());
			txtFin.setToolTipText(txtFin.getText());
			txtEstadoTrabajo.setText(persona.getDatosProfesionales()
					.getEstado());
			txtEstadoTrabajo.setToolTipText(txtEstadoTrabajo.getText());
			txtEmpleo.setText(StringsHP_BD.tipoEmpresaHP(persona
					.getDatosProfesionales().getTipoEmpresa()));
			txtEmpleo.setToolTipText(txtEmpleo.getText());
			txtSalario.setText(StringsHP_BD.salarioHP(persona
					.getDatosProfesionales().getSalarioAnual()));
			txtSalario.setToolTipText(txtSalario.getText());
			txtHorario.setText(StringsHP_BD.horarioHP(persona
					.getDatosProfesionales().getHorario()));
			txtHorario.setToolTipText(txtHorario.getText());
		} else {
			cmbProvincia2.setSelectedItem(StringsHP_BD.provinciaHP(persona
					.getResidencia().getProvincia()));
			cmbTipoResidencia.setSelectedItem(StringsHP_BD
					.tipoResidenciaHP(persona.getResidencia()
							.getTipoResidencia()));
			cmbContrato.setSelectedItem(StringsHP_BD.tipoContratoHP(persona
					.getResidencia().getTipoContrato()));
			cmbZona.setSelectedItem(persona.getResidencia().getZona());
			cmbEstadoCivil.setSelectedItem(persona.getDatosSociales()
					.getEstadoCivil());
			cmbHijos.setSelectedItem(StringsHP_BD.numHijosHP(persona
					.getDatosSociales().getNumHijos()));
			cmbHijosMen.setSelectedItem(StringsHP_BD.numHijosHP(persona
					.getDatosSociales().getNumHijosMenores()));
			cmbNivel.setSelectedItem(StringsHP_BD.nivelEstudiosHP(persona
					.getEstudios().getNivelMaximo()));
			cmbCentro.setSelectedItem(StringsHP_BD.tipoCentroHP(persona
					.getEstudios().getCentro()));
			dateFin.setYear(Integer
					.valueOf(persona.getEstudios().getFechaFin()));
			cmbEstado.setSelectedItem(persona.getDatosProfesionales()
					.getEstado());
			cmbEmpleo.setSelectedItem(StringsHP_BD.tipoEmpresaHP(persona
					.getDatosProfesionales().getTipoEmpresa()));
			cmbSalario.setSelectedItem(StringsHP_BD.salarioHP(persona
					.getDatosProfesionales().getSalarioAnual()));
			cmbHorario.setSelectedItem(StringsHP_BD.horarioHP(persona
					.getDatosProfesionales().getHorario()));
		}
	}

	/**
	 * Rellena los datos en el modo <i>Consultar</i>.
	 */
	public void rellenaConsulta() {
		rellenaDatosPersonales();
	}

	/**
	 * @param cmbCentro
	 */
	public void setCmbCentro(JComboBox<String> cmbCentro) {
		this.cmbCentro = cmbCentro;
	}

	/**
	 * @param cmbContrato
	 */
	public void setCmbContrato(JComboBox<String> cmbContrato) {
		this.cmbContrato = cmbContrato;
	}

	/**
	 * @param cmbEmpleo
	 */
	public void setCmbEmpleo(JComboBox<String> cmbEmpleo) {
		this.cmbEmpleo = cmbEmpleo;
	}

	/**
	 * @param cmbEstado
	 */
	public void setCmbEstado(JComboBox<String> cmbEstado) {
		this.cmbEstado = cmbEstado;
	}

	/**
	 * @param cmbEstadoCivil
	 */
	public void setCmbEstadoCivil(JComboBox<String> cmbEstadoCivil) {
		this.cmbEstadoCivil = cmbEstadoCivil;
	}

	/**
	 * @param cmbHijos
	 */
	public void setCmbHijos(JComboBox<String> cmbHijos) {
		this.cmbHijos = cmbHijos;
	}

	/**
	 * @param cmbHijosMen
	 */
	public void setCmbHijosMen(JComboBox<String> cmbHijosMen) {
		this.cmbHijosMen = cmbHijosMen;
	}

	/**
	 * @param cmbHorario
	 */
	public void setCmbHorario(JComboBox<String> cmbHorario) {
		this.cmbHorario = cmbHorario;
	}

	/**
	 * @param cmbNivel
	 */
	public void setCmbNivel(JComboBox<String> cmbNivel) {
		this.cmbNivel = cmbNivel;
	}

	/**
	 * @param cmbProvincia
	 */
	public void setCmbProvincia(JComboBox<String> cmbProvincia) {
		this.cmbProvincia = cmbProvincia;
	}

	/**
	 * @param cmbProvincia2
	 */
	public void setCmbProvincia2(JComboBox<String> cmbProvincia2) {
		this.cmbProvincia2 = cmbProvincia2;
	}

	/**
	 * @param cmbSalario
	 */
	public void setCmbSalario(JComboBox<String> cmbSalario) {
		this.cmbSalario = cmbSalario;
	}

	/**
	 * @param cmbTipoResidencia
	 */
	public void setCmbTipoResidencia(JComboBox<String> cmbTipoResidencia) {
		this.cmbTipoResidencia = cmbTipoResidencia;
	}

	/**
	 * @param cmbZona
	 */
	public void setCmbZona(JComboBox<String> cmbZona) {
		this.cmbZona = cmbZona;
	}

	/**
	 * @param dateFin
	 */
	public void setDateFin(JYearChooser dateFin) {
		this.dateFin = dateFin;
	}

	/**
	 * @param dateFNac
	 */
	public void setDateFNac(JDateChooser dateFNac) {
		this.dateFNac = dateFNac;
	}

	/**
	 * @param datos
	 *            the datos to set
	 */
	public void setDatosCliente(DatosCliente datos) {
		this.datosCliente = datos;
	}

	/**
	 * @param modo
	 *            the modo to set
	 */
	public void setModo(ModoFormSecundario modo) {
		this.modoFormulario = modo;
	}

	/**
	 * @param modoConsulta
	 *            the modoConsulta to set
	 */
	public void setModoConsulta(ModoConsulta modoConsulta) {
		this.modoConsulta = modoConsulta;
	}

	/**
	 * @param nivelInferencia
	 *            the nivelInferencia to set
	 */
	public void setNivelInferencia(int nivelInferencia) {
		this.nivelInferencia = nivelInferencia;
	}

	/**
	 * @param panelCentral
	 *            the panelCentral to set
	 */
	public void setPanelCentral(JPanel panelCentral) {
		this.panelCentral = panelCentral;
	}

	/**
	 * @param panelLog
	 *            the panelLog to set
	 */
	public void setPanelLog(JTextPaneClonable panelLog) {
		this.panelLog = panelLog;
	}

	/**
	 * @param rdbtnHombre
	 */
	public void setRdbtnHombre(JRadioButton rdbtnHombre) {
		this.rdbtnHombre = rdbtnHombre;
	}

	/**
	 * @param rdbtnMujer
	 */
	public void setRdbtnMujer(JRadioButton rdbtnMujer) {
		this.rdbtnMujer = rdbtnMujer;
	}

	/**
	 * @param rdbtnNo
	 */
	public void setRdbtnNo(JRadioButton rdbtnNo) {
		this.rdbtnNo = rdbtnNo;
	}

	/**
	 * @param rdbtnSi
	 */
	public void setRdbtnSi(JRadioButton rdbtnSi) {
		this.rdbtnSi = rdbtnSi;
	}

	/**
	 * @param scrollPane
	 *            the scrollPane to set
	 */
	public void setScrollPane(JScrollPane scrollPane) {
		this.scrollPane = scrollPane;
	}

	/**
	 * @param tabla
	 *            the tabla to set
	 */
	public void setTabla(JTable tabla) {
		this.tabla = tabla;
	}

	/**
	 * @param toolBar
	 *            the toolBar to set
	 */
	public void setToolBar(JToolBar toolBar) {
		this.toolBar = toolBar;
	}

	/**
	 * @param txtAnyos
	 */
	public void setTxtAnyos(JTextFieldDigitosFoco txtAnyos) {
		this.txtAnyos = txtAnyos;
	}

	/**
	 * @param txtApellido1
	 */
	public void setTxtApellido1(JTextFieldFoco txtApellido1) {
		this.txtApellido1 = txtApellido1;
	}

	/**
	 * @param txtApellido2
	 */
	public void setTxtApellido2(JTextFieldFoco txtApellido2) {
		this.txtApellido2 = txtApellido2;
	}

	/**
	 * @param txtCoste
	 */
	public void setTxtCoste(JTextFieldDigitosFoco txtCoste) {
		this.txtCoste = txtCoste;
	}

	/**
	 * @param txtDireccion
	 */
	public void setTxtDireccion(JTextFieldFoco txtDireccion) {
		this.txtDireccion = txtDireccion;
	}

	/**
	 * @param txtDNI
	 */
	public void setTxtDNI(JTextFieldFoco txtDNI) {
		this.txtDNI = txtDNI;
	}

	/**
	 * @param txtEstudio
	 */
	public void setTxtEstudio(JTextFieldFoco txtEstudio) {
		this.txtEstudio = txtEstudio;
	}

	/**
	 * @param txtLocalidad
	 */
	public void setTxtLocalidad(JTextFieldFoco txtLocalidad) {
		this.txtLocalidad = txtLocalidad;
	}

	/**
	 * @param txtMunicipio
	 */
	public void setTxtMunicipio(JTextFieldFoco txtMunicipio) {
		this.txtMunicipio = txtMunicipio;
	}

	/**
	 * @param txtNombre
	 */
	public void setTxtNombre(JTextFieldFoco txtNombre) {
		this.txtNombre = txtNombre;
	}

	/**
	 * @param txtPuesto
	 */
	public void setTxtPuesto(JTextFieldFoco txtPuesto) {
		this.txtPuesto = txtPuesto;
	}

	/**
	 * @param txtTelf
	 */
	public void setTxtTelf(JTextFieldDigitosFoco txtTelf) {
		this.txtTelf = txtTelf;
	}

	/**
	 * Muestra una ventana de informaci&oacute;n.
	 * 
	 * @param msg
	 * @param titulo
	 */
	public void ventanaInfo(String msg, String titulo) {
		JOptionPane.showMessageDialog(this, msg, titulo,
				JOptionPane.INFORMATION_MESSAGE, FormPrincipal.iconoAviso);
	}

	/**
	 * Muestra una ventana que da a elegir entre dos opciones (S&iacute; o No).
	 * 
	 * @param msg
	 * @param titulo
	 * 
	 * @return El valor de la opci&oacute;n elegida.
	 */
	public int ventanaOpcion(String msg, String titulo) {
		return JOptionPane.showConfirmDialog(this, msg, titulo,
				JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
				FormPrincipal.iconoAviso);
	}

	/* PRIVADOS */
	private void actualizaCmbHijosMenores(String hijos) {
		if (cmbHijosMen != null) {
			cmbHijosMen.removeAllItems();
			cmbHijosMen.setEnabled(true);
			if (hijos.equals("0")) {
				cmbHijosMen.addItem("0");
			} else if (hijos.equals("1")) {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
			} else if (hijos.equals("2")) {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
				cmbHijosMen.addItem("2");
			} else if (hijos.equals("3")) {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
				cmbHijosMen.addItem("2");
				cmbHijosMen.addItem("3");
			} else if (hijos.equals("4")) {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
				cmbHijosMen.addItem("2");
				cmbHijosMen.addItem("3");
				cmbHijosMen.addItem("4");
			} else if (hijos.equals("5")) {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
				cmbHijosMen.addItem("2");
				cmbHijosMen.addItem("3");
				cmbHijosMen.addItem("4");
				cmbHijosMen.addItem("5");
			} else {
				cmbHijosMen.addItem("0");
				cmbHijosMen.addItem("1");
				cmbHijosMen.addItem("2");
				cmbHijosMen.addItem("3");
				cmbHijosMen.addItem("4");
				cmbHijosMen.addItem("5");
				cmbHijosMen.addItem("M\u00e1s de 5");
			}
		}
	}

	private void actualizaSeleccion(int fila) {
		tabla.getSelectionModel().setSelectionInterval(fila - 1, fila - 1);
	}

	private void botonDerechoTablaActionPerformed(MouseEvent e) {
		if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			if (tabla.getSelectedRow() != -1) {
				if (tabla.getValueAt(tabla.getSelectedRow(), 0) != null) {
					popupMenu.show(e.getComponent(), e.getX(), e.getY());
				}
			}
		}
	}

	private void btnDerActionPerformed(ActionEvent e) {
		Controlador.cierraVistaSecundaria();
	}

	private void btnIzqActionPerformed(ActionEvent e) {
		try {
			compruebaDatosCliente();
			obtenerDatosCliente();
			if (modoFormulario == ModoFormSecundario.M_EDITAR) {
				if (!(datosCliente.getPersona().getDni()
						.equalsIgnoreCase(Controlador.dni))) {
					for (int i = 0; i < datosCliente.getHobbies().size(); i++) {
						((Hobbie) datosCliente.getHobbies().get(i)).getId()
								.setDni(datosCliente.getPersona().getDni());
					}
					for (int i = 0; i < datosCliente.getHistorial().size(); i++) {
						((Historial) datosCliente.getHistorial().get(i))
								.getId().setDni(
										datosCliente.getPersona().getDni());
					}
				}
				Controlador.editarCliente(datosCliente);
			} else if (modoFormulario == ModoFormSecundario.M_NUEVO) {
				Controlador.dni = datosCliente.getPersona().getDni();
				for (int i = 0; i < datosCliente.getHobbies().size(); i++) {
					((Hobbie) datosCliente.getHobbies().get(i)).getId().setDni(
							Controlador.dni);
				}
				for (int i = 0; i < datosCliente.getHistorial().size(); i++) {
					((Historial) datosCliente.getHistorial().get(i)).getId()
							.setDni(Controlador.dni);
				}
				Controlador.nuevoCliente(datosCliente);
			}
		} catch (ExcepcionCapturaDatos ex) {
			ventanaInfo(ex.getMessage(), ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL AGREGAR O EDITAR CLIENTE");
			ex.printStackTrace();
		}
	}

	private void btnOpcion1ActionPerformed(ActionEvent e) {
		if (modoFormulario == ModoFormSecundario.M_CONSULTAR) {
			if (nivelInferencia == 2) {
				Controlador.borrarSintomasPrevios();
				HashMap<String, Object> datos = obtenerCamposInferencia();
				Controlador.nuevasVariables(datos);
			} else if (nivelInferencia == 3) {
				Controlador.borrarPatologiasPrevias();
			} else if (nivelInferencia == 4) {
				Controlador.borrarResultadosPrevios();
			}
			Controlador.consultar(nivelInferencia);
			Controlador.siguiente(nivelInferencia);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			Controlador.showVistaAnadir(ModoAnadir.M_ADD_HECHO, null);
		}
	}

	private void btnOpcion2ActionPerformed(ActionEvent e) {
		if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			Controlador.showVistaAnadir(ModoAnadir.M_ADD_HOBBIE, null);
		} else if (modoFormulario == ModoFormSecundario.M_CONSULTAR) {
			btnOpcion2.setEnabled(false);
			Controlador.despliegaLog((JTextPane) panelLog.clone(),
					(JButton) ((JButtonClonable) btnOpcion1).clone(),
					(JButton) ((JButtonClonable) btnGuardar).clone());
		}
	}

	private void compruebaDatosCliente() throws ExcepcionCapturaDatos {
		if (txtDNI.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_DNI);
		}
		if (txtNombre.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_NOMBRE);
		}
		if (txtApellido1.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_APELLIDO1);
		}
		if (txtApellido2.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_APELLIDO2);
		}
		if (txtTelf.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_TELEFONO);
		}
		if (dateFNac.getDate() == null) {
			throw new ExcepcionCapturaDatos(
					ConstantsString.ERROR_FECHA_NACIMIENTO);
		}
		if (txtLocalidad.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_LOCALIDAD);
		}
		if (grupoSexo.getSelection() == null) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_SEXO);
		}
		if (txtDireccion.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_DIRECCION);
		}
		if (txtMunicipio.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_MUNICIPIO);
		}
		if (txtCoste.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_COSTE);
		}
		if (grupoEmancipado.getSelection() == null) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_EMANCIPADO);
		}
		if (txtEstudio.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_ESTUDIOS);
		}
		if (txtPuesto.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(ConstantsString.ERROR_PUESTO);
		}
		if (txtAnyos.getText().equals(ConstantsString.VACIO)) {
			throw new ExcepcionCapturaDatos(
					ConstantsString.ERROR_ANYOS_TRABAJADOS);
		}
	}

	private void dobleClickTablaActionPerformed(MouseEvent e) {
		editar();
	}

	private void editar() {
		String valorCelda;
		if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			valorCelda = (String) tabla.getValueAt(tabla.getSelectedRow(), 0);
			if (valorCelda != null) {
				if (modoLista == ModoListaSecundario.L_HOBBIE) {
					Controlador.nombreHobbie = valorCelda;
					Controlador.showVistaAnadir(ModoAnadir.M_ED_HOBBIE,
							getHobbieTabla());
				} else {
					getCodigoHecho();
					Controlador.showVistaAnadir(ModoAnadir.M_ED_HECHO,
							getHistoriaTabla());
				}
			}
		}
	}

	private void generaBarraBotones() {
		JButton btnDer = new JButton("Aceptar");
		btnDer.setToolTipText("Aceptar");
		btnDer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		btnDer.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
				.getResource("icono_aceptar_20x20.png")));
		btnDer.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				btnDerActionPerformed(e);
			}
		});

		if ((modoFormulario == ModoFormSecundario.M_NUEVO)
				|| (modoFormulario == ModoFormSecundario.M_EDITAR)) {
			btnDer.setText("Cancelar");
			btnDer.setToolTipText("Cancelar");
			btnDer.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
					.getResource("icono_cancelar_20x20.png")));

			JButton btnIzq = new JButton("Aceptar");
			btnIzq.setToolTipText("Aceptar");
			btnIzq.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnIzq.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
					.getResource("icono_aceptar_20x20.png")));
			btnIzq.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					btnIzqActionPerformed(e);
				}
			});
			toolBar.add(btnIzq);

			JSeparator separador = new JSeparator();
			separador.setMinimumSize(new Dimension(5, 28));
			separador.setMaximumSize(new Dimension(5, 28));
			separador.setPreferredSize(new Dimension(5, 28));
			toolBar.add(separador);

		}
		toolBar.add(btnDer);
	}

	private void generaBarraOpciones() {
		barraOpciones.setFocusable(false);
		barraOpciones.setFloatable(false);

		switch (modoFormulario) {
		case M_VER:
		case M_EDITAR:
		case M_NUEVO:
			panelCentral.add(barraOpciones, "1, 5, center, fill");

			ButtonGroup grupo = new ButtonGroup();

			JToggleButton tgBtnOpcion1 = new JToggleButton(
					"Historial cl\u00ednico");
			tgBtnOpcion1
					.setToolTipText("Muestra el historial cl\u00ednico del cliente actual.");
			tgBtnOpcion1
					.setIcon(new ImageIcon(FormSecundario.class
							.getClassLoader().getResource(
									"icono_historial_20x20.png")));
			tgBtnOpcion1.setCursor(Cursor
					.getPredefinedCursor(Cursor.HAND_CURSOR));
			tgBtnOpcion1.setSelected(true);
			tgBtnOpcion1.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					tgBtnOpcion1ActionPerformed(e);
				}
			});
			grupo.add(tgBtnOpcion1);

			JSeparator separador1 = new JSeparator();
			separador1.setSize(new Dimension(5, 28));
			separador1.setPreferredSize(new Dimension(5, 28));
			separador1.setMinimumSize(new Dimension(5, 28));
			separador1.setMaximumSize(new Dimension(5, 28));

			JToggleButton tgBtnOpcion2 = new JToggleButton("Listar hobbies");
			tgBtnOpcion2
					.setToolTipText("Lista los hobbies del cliente actual.");
			tgBtnOpcion2.setIcon(new ImageIcon(FormSecundario.class
					.getClassLoader().getResource(
							"icono_listar_hobbies_20x20.png")));
			tgBtnOpcion2.setCursor(Cursor
					.getPredefinedCursor(Cursor.HAND_CURSOR));
			tgBtnOpcion2.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					tgBtnOpcion2ActionPerformed(e);
				}
			});
			grupo.add(tgBtnOpcion2);

			barraOpciones.add(tgBtnOpcion1);
			barraOpciones.add(separador1);
			barraOpciones.add(tgBtnOpcion2);

			if (modoFormulario != ModoFormSecundario.M_VER) {
				JSeparator separador2 = new JSeparator();
				separador2.setSize(new Dimension(45, 28));
				separador2.setPreferredSize(new Dimension(45, 28));
				separador2.setMinimumSize(new Dimension(45, 28));
				separador2.setMaximumSize(new Dimension(45, 28));
				barraOpciones.add(separador2);

				btnOpcion1 = new JButton("A\u00f1adir hecho cl\u00ednico");
				btnOpcion1
						.setToolTipText("A\u00f1ade un hecho cl\u00ednico al historial del cliente actual.");
				btnOpcion1.setIcon(new ImageIcon(FormSecundario.class
						.getClassLoader().getResource(
								"icono_anadir_hecho_20x20.png")));
				barraOpciones.add(btnOpcion1);

				JSeparator separador3 = new JSeparator();
				separador3.setSize(new Dimension(5, 28));
				separador3.setPreferredSize(new Dimension(5, 28));
				separador3.setMinimumSize(new Dimension(5, 28));
				separador3.setMaximumSize(new Dimension(5, 28));
				barraOpciones.add(separador3);

				btnOpcion2 = new JButton("A\u00f1adir hobbie");
				btnOpcion2
						.setToolTipText("A\u00f1ade un nuevo hobbie al cliente actual.");
				btnOpcion2.setIcon(new ImageIcon(FormSecundario.class
						.getClassLoader().getResource(
								"icono_anadir_hobbie_20x20.png")));

				barraOpciones.add(btnOpcion2);
			}
			break;
		case M_CONSULTAR:
			JSeparator separador2 = new JSeparator();
			separador2.setSize(new Dimension(45, 28));
			separador2.setPreferredSize(new Dimension(45, 28));
			separador2.setMinimumSize(new Dimension(45, 28));
			separador2.setMaximumSize(new Dimension(45, 28));
			barraOpciones.add(separador2);

			panelCentral.add(barraOpciones, "1, 3, center, fill");

			btnOpcion1 = new JButtonClonable("Siguiente");
			btnOpcion1
					.setToolTipText("Avanza al siguiente paso de inferencia.");
			btnOpcion1
					.setIcon(new ImageIcon(FormSecundario.class
							.getClassLoader().getResource(
									"icono_consultar_20x20.png")));
			barraOpciones.add(btnOpcion1);

			JSeparator separador3 = new JSeparator();
			separador3.setSize(new Dimension(5, 28));
			separador3.setPreferredSize(new Dimension(5, 28));
			separador3.setMinimumSize(new Dimension(5, 28));
			separador3.setMaximumSize(new Dimension(5, 28));
			barraOpciones.add(separador3);

			btnOpcion2 = new JButton("Desplegar");
			btnOpcion2
					.setToolTipText("Desplegar resultados en una ventana nueva.");
			btnOpcion2
					.setIcon(new ImageIcon(FormSecundario.class
							.getClassLoader().getResource(
									"icono_desplegar_20x20.png")));
			barraOpciones.add(btnOpcion2);

			JSeparator separador4 = new JSeparator();
			separador4.setMinimumSize(new Dimension(15, 28));
			separador4.setMaximumSize(new Dimension(15, 28));
			separador4.setPreferredSize(new Dimension(15, 28));
			barraOpciones.add(separador4);

			btnGuardar = new JButtonClonable("Guardar");
			btnGuardar
					.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnGuardar.setIcon(new ImageIcon(FormSecundario.class
					.getClassLoader().getResource("icono_guardar_20x20.png")));
			btnGuardar
					.setToolTipText("Guardar resultados en un archivo de texto.");
			btnGuardar.setEnabled(false);
			btnGuardar.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					String nombre = txtNombre.getText() + " "
							+ txtApellido1.getText() + " "
							+ txtApellido2.getText();
					Controlador.guardaResultado(Controlador.dni, nombre);
				}
			});
			barraOpciones.add(btnGuardar);
		}

		if (btnOpcion1 != null) {
			btnOpcion1
					.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnOpcion1.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					btnOpcion1ActionPerformed(e);
				}
			});
		}

		if (btnOpcion2 != null) {
			btnOpcion2
					.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			btnOpcion2.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					btnOpcion2ActionPerformed(e);
				}
			});
		}
	}

	private void generaPanelCentral() {
		Border borde = BorderFactory.createLineBorder(new Color(150, 136, 137));
		TitledBorder tb1 = new TitledBorder(borde, "Datos Personales");
		JPanel panelDPers = new JPanel();
		panelDPers.setBorder(tb1);
		generaPanelDPers(panelDPers); // Igual para cualquier tipo de panel

		switch (modoFormulario) {
		case M_VER:
		case M_NUEVO:
		case M_EDITAR:
			panelCentral.setLayout(new FormLayout(new ColumnSpec[] { ColumnSpec
					.decode("990px:grow"), }, new RowSpec[] {
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("80px", false),
							Sizes.constant("80px", false)), 0),
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("110px", false),
							Sizes.constant("110px", false)), 0),
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("60px", false),
							Sizes.constant("60px", false)), 0),
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("80px", false),
							Sizes.constant("80px", false)), 0),
					new RowSpec(RowSpec.CENTER, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("35px", false),
							Sizes.constant("35px", false)), 0), }));

			TitledBorder tb2 = new TitledBorder(borde, "Datos Sociales");
			JPanel panelDSoc = new JPanel();
			panelDSoc.setBorder(tb2);

			generaPanelDSoc(panelDSoc);
			panelCentral.add(panelDSoc, "1, 2, fill, fill");

			TitledBorder tb3 = new TitledBorder(borde, "Estudios");
			JPanel panelEst = new JPanel();
			panelEst.setBorder(tb3);

			generaPanelEstudios(panelEst);
			panelCentral.add(panelEst, "1, 3, fill, fill");

			TitledBorder tb4 = new TitledBorder(borde, "Datos Profesionales");
			JPanel panelDProf = new JPanel();
			panelDProf.setBorder(tb4);

			generaPanelDProf(panelDProf);
			panelCentral.add(panelDProf, "1, 4, fill, fill");
			break;
		case M_CONSULTAR:
			panelCentral.setLayout(new FormLayout(new ColumnSpec[] { ColumnSpec
					.decode("990px:grow"), }, new RowSpec[] {
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("82px", false),
							Sizes.constant("82px", false)), 0),
					new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("246px", false),
							Sizes.constant("246px", false)), 0),
					new RowSpec(RowSpec.CENTER, Sizes.bounded(Sizes.PREFERRED,
							Sizes.constant("35px", false),
							Sizes.constant("35px", false)), 0), }));
			TitledBorder tbConsulta = new TitledBorder(borde, "Inferencia");
			JPanel panelConsulta = new JPanel();
			panelConsulta.setBorder(tbConsulta);

			generaPanelConsulta(panelConsulta);
			panelCentral.add(panelConsulta, "1, 2, fill, fill");
		}
		panelCentral.add(panelDPers, "1, 1, fill, fill");
		panelCentral.setFocusable(false);
	}

	private void generaPanelConsulta(JPanel panelConsulta) {
		panelConsulta.setLayout(new FormLayout(new ColumnSpec[] {
				new ColumnSpec(ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("90px", false),
						Sizes.constant("90px", false)), 0),
				new ColumnSpec(ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("300px", false),
						Sizes.constant("300px", false)), 0),
				new ColumnSpec(ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("120px", false),
						Sizes.constant("120px", false)), 0),
				new ColumnSpec(ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("600px", false),
						Sizes.constant("600px", false)), 0) },
				new RowSpec[] { new RowSpec(RowSpec.FILL, Sizes.bounded(
						Sizes.PREFERRED, Sizes.constant("220px", false),
						Sizes.constant("220px", false)), 0) }));
		generaPanelModo(panelConsulta);
		generaPanelParams(panelConsulta);
	}

	private void generaPanelDPers(JPanel panelDPers) {

		panelDPers.setLayout(new FlowLayout(FlowLayout.CENTER));

		JLabel lblDNI = new JLabel("DNI:");
		panelDPers.add(lblDNI);

		txtDNI = new JTextFieldFoco();
		lblDNI.setLabelFor(txtDNI);
		txtDNI.setColumns(10);
		txtDNI.requestFocusInWindow();
		txtDNI.setDocument(new JTextFieldDni(txtDNI));
		panelDPers.add(txtDNI);

		JLabel lblNombre = new JLabel("Nombre: ");
		panelDPers.add(lblNombre);

		txtNombre = new JTextFieldFoco();
		lblNombre.setLabelFor(txtNombre);
		txtNombre.setColumns(10);
		panelDPers.add(txtNombre);

		JLabel lblApellido1 = new JLabel("Primer apellido: ");
		panelDPers.add(lblApellido1);

		txtApellido1 = new JTextFieldFoco();
		lblApellido1.setLabelFor(txtApellido1);
		txtApellido1.setColumns(10);
		panelDPers.add(txtApellido1);

		JLabel lblApellido2 = new JLabel("Segundo apellido: ");
		panelDPers.add(lblApellido2);

		txtApellido2 = new JTextFieldFoco();
		lblApellido2.setLabelFor(txtApellido2);
		txtApellido2.setColumns(10);
		panelDPers.add(txtApellido2);

		JLabel lblTelf = new JLabel("Tel\u00e9fono: ");
		panelDPers.add(lblTelf);

		txtTelf = new JTextFieldDigitosFoco();
		lblTelf.setLabelFor(txtTelf);
		txtTelf.setColumns(10);
		txtTelf.setDocument(new JTextFieldLimite(txtTelf, 9));
		panelDPers.add(txtTelf);

		JLabel lblFNac = new JLabel("Fecha de nacimiento: ");
		panelDPers.add(lblFNac);

		if ((modoFormulario == ModoFormSecundario.M_VER)
				|| (modoFormulario == ModoFormSecundario.M_CONSULTAR)) {
			txtFNac = new JTextFieldFoco();
			lblFNac.setLabelFor(txtFNac);
			txtFNac.setColumns(10);
			panelDPers.add(txtFNac);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			dateFNac = new JDateChooser();
			dateFNac.getJCalendar().getYearChooser().setStartYear(1940);
			dateFNac.getJCalendar().getYearChooser().setEndYear(2011);
			dateFNac.getJCalendar().setWeekOfYearVisible(false);
			dateFNac.getJCalendar().setTodayButtonVisible(true);
			lblFNac.setToolTipText("Entre 1-ene-1940 y 31-dic-2011");
			lblFNac.setLabelFor(dateFNac);
			panelDPers.add(dateFNac);
		}

		JLabel lblLocalidad = new JLabel("Localidad: ");
		panelDPers.add(lblLocalidad);

		txtLocalidad = new JTextFieldFoco();
		lblLocalidad.setLabelFor(txtLocalidad);
		txtLocalidad.setColumns(15);
		panelDPers.add(txtLocalidad);

		JLabel lblProvincia = new JLabel("Provincia: ");
		panelDPers.add(lblProvincia);

		if ((modoFormulario == ModoFormSecundario.M_VER)
				|| (modoFormulario == ModoFormSecundario.M_CONSULTAR)) {
			txtProvincia = new JTextFieldFoco();
			lblProvincia.setLabelFor(txtProvincia);
			txtProvincia.setColumns(10);
			panelDPers.add(txtProvincia);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbProvincia = new JComboBox<String>();
			lblProvincia.setLabelFor(cmbProvincia);
			generaProvincias(cmbProvincia);
			panelDPers.add(cmbProvincia);
		}

		JLabel lblSexo = new JLabel("Sexo: ");
		panelDPers.add(lblSexo);

		rdbtnHombre = new JRadioButton("HOMBRE");
		rdbtnHombre.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		rdbtnHombre.setAlignmentX(Component.CENTER_ALIGNMENT);
		grupoSexo.add(rdbtnHombre);
		panelDPers.add(rdbtnHombre);

		rdbtnMujer = new JRadioButton("MUJER");
		rdbtnMujer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		rdbtnMujer.setAlignmentX(Component.CENTER_ALIGNMENT);
		grupoSexo.add(rdbtnMujer);
		panelDPers.add(rdbtnMujer);

		if ((modoFormulario == ModoFormSecundario.M_VER)
				|| (modoFormulario == ModoFormSecundario.M_CONSULTAR)) {
			txtDNI.setEditable(false);
			txtDNI.setFocusable(false);
			txtDNI.setBackground(colorDisabled);
			txtNombre.setEditable(false);
			txtNombre.setFocusable(false);
			txtNombre.setBackground(colorDisabled);
			txtApellido1.setEditable(false);
			txtApellido1.setFocusable(false);
			txtApellido1.setBackground(colorDisabled);
			txtApellido2.setEditable(false);
			txtApellido2.setFocusable(false);
			txtApellido2.setBackground(colorDisabled);
			txtTelf.setEditable(false);
			txtTelf.setFocusable(false);
			txtTelf.setBackground(colorDisabled);
			txtFNac.setEditable(false);
			txtFNac.setFocusable(false);
			txtFNac.setBackground(colorDisabled);
			txtLocalidad.setEditable(false);
			txtLocalidad.setFocusable(false);
			txtLocalidad.setBackground(colorDisabled);
			txtProvincia.setEditable(false);
			txtProvincia.setFocusable(false);
			txtProvincia.setBackground(colorDisabled);
			rdbtnHombre.setEnabled(false);
			rdbtnHombre.setFocusable(false);
			rdbtnMujer.setEnabled(false);
			rdbtnMujer.setFocusable(false);
		}
	}

	private void generaPanelDProf(JPanel panelDProf) {

		JLabel lblEstado = new JLabel("Estado actual: ");
		panelDProf.add(lblEstado);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtEstadoTrabajo = new JTextFieldFoco();
			lblEstado.setLabelFor(txtEstadoTrabajo);
			txtEstadoTrabajo.setColumns(10);
			panelDProf.add(txtEstadoTrabajo);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbEstado = new JComboBox<String>();
			lblEstado.setLabelFor(cmbEstado);
			cmbEstado.addItem("Activo/a");
			cmbEstado.addItem("Inactivo/a");
			cmbEstado.addItem("Parado/a");
			cmbEstado.addItem("Jubilado/a");
			panelDProf.add(cmbEstado);
		}

		JLabel lblPuesto = new JLabel("Puesto: ");
		panelDProf.add(lblPuesto);

		txtPuesto = new JTextFieldFoco();
		lblPuesto.setLabelFor(txtPuesto);
		txtPuesto.setColumns(20);
		panelDProf.add(txtPuesto);

		JLabel lblEmpleo = new JLabel("Tipo de empleo: ");
		panelDProf.add(lblEmpleo);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtEmpleo = new JTextFieldFoco();
			lblEmpleo.setLabelFor(txtEmpleo);
			txtEmpleo.setColumns(10);
			panelDProf.add(txtEmpleo);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbEmpleo = new JComboBox<String>();
			lblEmpleo.setLabelFor(cmbEmpleo);
			cmbEmpleo.addItem("Ninguno");
			cmbEmpleo.addItem("Asalariado/a");
			cmbEmpleo.addItem("Aut\u00f3nomo/a");
			cmbEmpleo.addItem("Propietario/a");
			cmbEmpleo.addItem("Funcionario/a");
			cmbEmpleo.addItem("Becario/a");
			panelDProf.add(cmbEmpleo);
		}

		JLabel lblAnyos = new JLabel("A\u00f1os trabajados: ");
		panelDProf.add(lblAnyos);

		txtAnyos = new JTextFieldDigitosFoco();
		lblAnyos.setLabelFor(txtAnyos);
		txtAnyos.setColumns(10);
		panelDProf.add(txtAnyos);

		JLabel lblSalario = new JLabel("Salario anual (en euros): ");
		panelDProf.add(lblSalario);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtSalario = new JTextFieldFoco();
			lblSalario.setLabelFor(txtSalario);
			txtSalario.setColumns(15);
			panelDProf.add(txtSalario);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbSalario = new JComboBox<String>();
			lblSalario.setLabelFor(cmbSalario);
			cmbSalario.addItem("Menos de 10.000");
			cmbSalario.addItem("Entre 10.000 y 20.000");
			cmbSalario.addItem("Entre 20.000 y 30.000");
			cmbSalario.addItem("Entre 30.000 y 40.000");
			cmbSalario.addItem("Entre 40.000 y 50.000");
			cmbSalario.addItem("M\u00e1s de 50.000");
			panelDProf.add(cmbSalario);
		}

		JLabel lblHorario = new JLabel("Horario: ");
		panelDProf.add(lblHorario);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtHorario = new JTextFieldFoco();
			lblHorario.setLabelFor(txtHorario);
			txtHorario.setColumns(10);
			panelDProf.add(txtHorario);
			txtEstadoTrabajo.setEditable(false);
			txtEstadoTrabajo.setFocusable(false);
			txtEstadoTrabajo.setBackground(colorDisabled);
			txtPuesto.setEditable(false);
			txtPuesto.setFocusable(false);
			txtPuesto.setBackground(colorDisabled);
			txtEmpleo.setEditable(false);
			txtEmpleo.setFocusable(false);
			txtEmpleo.setBackground(colorDisabled);
			txtAnyos.setEditable(false);
			txtAnyos.setFocusable(false);
			txtAnyos.setBackground(colorDisabled);
			txtSalario.setEditable(false);
			txtSalario.setFocusable(false);
			txtSalario.setBackground(colorDisabled);
			txtHorario.setEditable(false);
			txtHorario.setFocusable(false);
			txtHorario.setBackground(colorDisabled);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbHorario = new JComboBox<String>();
			lblHorario.setLabelFor(cmbHorario);
			cmbHorario.addItem("Ninguno");
			cmbHorario.addItem("Ma\u00f1ana");
			cmbHorario.addItem("Tarde");
			cmbHorario.addItem("Noche");
			panelDProf.add(cmbHorario);
		}
	}

	private void generaPanelDSoc(JPanel panelDSoc) {
		panelDSoc.setLayout(new FlowLayout(FlowLayout.CENTER));

		JLabel lblDireccion = new JLabel("Direcci\u00f3n:");
		panelDSoc.add(lblDireccion);

		txtDireccion = new JTextFieldFoco();
		lblDireccion.setLabelFor(txtDireccion);
		txtDireccion.setColumns(17);
		panelDSoc.add(txtDireccion);

		JLabel lblMunicipio = new JLabel("Municipio: ");
		panelDSoc.add(lblMunicipio);

		txtMunicipio = new JTextFieldFoco();
		lblMunicipio.setLabelFor(txtMunicipio);
		txtMunicipio.setColumns(15);
		panelDSoc.add(txtMunicipio);

		JLabel lblProvincia = new JLabel("Provincia: ");
		panelDSoc.add(lblProvincia);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtProvincia2 = new JTextFieldFoco();
			lblProvincia.setLabelFor(txtProvincia2);
			txtProvincia2.setColumns(10);
			panelDSoc.add(txtProvincia2);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbProvincia2 = new JComboBox<String>();
			lblProvincia.setLabelFor(cmbProvincia2);
			generaProvincias(cmbProvincia2);
			panelDSoc.add(cmbProvincia2);
		}

		JLabel lblTipo = new JLabel("Tipo de residencia: ");
		panelDSoc.add(lblTipo);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtTipoResidencia = new JTextFieldFoco();
			lblTipo.setLabelFor(txtTipoResidencia);
			txtTipoResidencia.setColumns(10);
			panelDSoc.add(txtTipoResidencia);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbTipoResidencia = new JComboBox<String>();
			lblTipo.setLabelFor(cmbTipoResidencia);
			cmbTipoResidencia.addItem("Piso");
			cmbTipoResidencia.addItem("Apartamento");
			cmbTipoResidencia.addItem("\u00c1tico");
			cmbTipoResidencia.addItem("D\u00faplex");
			cmbTipoResidencia.addItem("Loft");
			cmbTipoResidencia.addItem("Finca");
			cmbTipoResidencia.addItem("Chalet");
			cmbTipoResidencia.addItem("Bungalow");
			cmbTipoResidencia.addItem("Prefabricada");
			panelDSoc.add(cmbTipoResidencia);
		}

		JLabel lblContrato = new JLabel("Tipo de contrato: ");
		panelDSoc.add(lblContrato);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtContrato = new JTextFieldFoco();
			lblContrato.setLabelFor(txtContrato);
			txtContrato.setColumns(10);
			panelDSoc.add(txtContrato);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbContrato = new JComboBox<String>();
			lblContrato.setLabelFor(cmbContrato);
			cmbContrato.addItem("Alquiler");
			cmbContrato.addItem("Propiedad");
			cmbContrato.addItem("V. P. O.");
			panelDSoc.add(cmbContrato);
		}

		JLabel lblCoste = new JLabel("Coste (euros/mes): ");
		panelDSoc.add(lblCoste);

		txtCoste = new JTextFieldDigitosFoco();
		lblCoste.setLabelFor(txtCoste);
		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtCoste.setColumns(15);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			txtCoste.setColumns(20);
		}
		panelDSoc.add(txtCoste);

		JLabel lblZona = new JLabel("Zona residencial: ");
		panelDSoc.add(lblZona);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtZona = new JTextFieldFoco();
			lblZona.setLabelFor(txtZona);
			txtZona.setColumns(10);
			panelDSoc.add(txtZona);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbZona = new JComboBox<String>();
			lblZona.setLabelFor(cmbZona);
			cmbZona.addItem("Centro");
			cmbZona.addItem("Periferia");
			cmbZona.addItem("Residencial");
			cmbZona.addItem("Rural");
			panelDSoc.add(cmbZona);
		}

		JLabel lblEman = new JLabel("Emancipado/a: ");
		panelDSoc.add(lblEman);

		rdbtnSi = new JRadioButton("S\u00cd");
		rdbtnSi.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		rdbtnSi.setAlignmentX(Component.CENTER_ALIGNMENT);
		grupoEmancipado.add(rdbtnSi);
		panelDSoc.add(rdbtnSi);

		rdbtnNo = new JRadioButton("NO");
		rdbtnNo.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		rdbtnNo.setAlignmentX(Component.CENTER_ALIGNMENT);
		grupoEmancipado.add(rdbtnNo);
		panelDSoc.add(rdbtnNo);

		JLabel lblEstado = new JLabel("Estado civil: ");
		panelDSoc.add(lblEstado);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtEstadoCivil = new JTextFieldFoco();
			lblEstado.setLabelFor(txtEstadoCivil);
			txtEstadoCivil.setColumns(10);
			panelDSoc.add(txtEstadoCivil);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbEstadoCivil = new JComboBox<String>();
			lblEstado.setLabelFor(cmbEstadoCivil);
			cmbEstadoCivil.addItem("Soltero/a");
			cmbEstadoCivil.addItem("Casado/a");
			cmbEstadoCivil.addItem("Viudo/a");
			cmbEstadoCivil.addItem("Divorciado/a");
			panelDSoc.add(cmbEstadoCivil);
		}

		JLabel lblHijos = new JLabel("N\u00famero de hijos: ");
		panelDSoc.add(lblHijos);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtHijos = new JTextFieldFoco();
			lblHijos.setLabelFor(txtHijos);
			txtHijos.setColumns(10);
			panelDSoc.add(txtHijos);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbHijos = new JComboBox<String>();
			lblHijos.setLabelFor(cmbHijos);
			cmbHijos.addItem("0");
			cmbHijos.addItem("1");
			cmbHijos.addItem("2");
			cmbHijos.addItem("3");
			cmbHijos.addItem("4");
			cmbHijos.addItem("5");
			cmbHijos.addItem("M\u00e1s de 5");
			cmbHijos.addActionListener(new ActionListener() {

				@SuppressWarnings("unchecked")
				@Override
				public void actionPerformed(ActionEvent e) {
					JComboBox<String> cb = (JComboBox<String>) e.getSource();
					String hijos = (String) cb.getSelectedItem();
					actualizaCmbHijosMenores(hijos);
				}
			});
			cmbHijos.setSelectedItem("0");
			panelDSoc.add(cmbHijos);
		}

		JLabel lblHijosMen = new JLabel("Menores de edad: ");
		panelDSoc.add(lblHijosMen);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtHijosMen = new JTextFieldFoco();
			lblHijosMen.setLabelFor(txtHijosMen);
			txtHijosMen.setColumns(10);
			panelDSoc.add(txtHijosMen);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbHijosMen = new JComboBox<String>();
			lblHijos.setLabelFor(cmbHijosMen);
			cmbHijosMen.setEnabled(false);
			cmbHijosMen.addItem("0");
			cmbHijosMen.setSelectedItem("0");
			panelDSoc.add(cmbHijosMen);
		}

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtDireccion.setEditable(false);
			txtDireccion.setFocusable(false);
			txtDireccion.setBackground(colorDisabled);
			txtMunicipio.setEditable(false);
			txtMunicipio.setFocusable(false);
			txtMunicipio.setBackground(colorDisabled);
			txtProvincia2.setEditable(false);
			txtProvincia2.setFocusable(false);
			txtProvincia2.setBackground(colorDisabled);
			txtTipoResidencia.setEditable(false);
			txtTipoResidencia.setFocusable(false);
			txtTipoResidencia.setBackground(colorDisabled);
			txtContrato.setEditable(false);
			txtContrato.setFocusable(false);
			txtContrato.setBackground(colorDisabled);
			txtCoste.setEditable(false);
			txtCoste.setFocusable(false);
			txtCoste.setBackground(colorDisabled);
			txtZona.setEditable(false);
			txtZona.setFocusable(false);
			txtZona.setBackground(colorDisabled);
			rdbtnSi.setEnabled(false);
			rdbtnSi.setFocusable(false);
			rdbtnNo.setEnabled(false);
			rdbtnNo.setFocusable(false);
			txtEstadoCivil.setEditable(false);
			txtEstadoCivil.setFocusable(false);
			txtEstadoCivil.setBackground(colorDisabled);
			txtHijos.setEditable(false);
			txtHijos.setFocusable(false);
			txtHijos.setBackground(colorDisabled);
			txtHijosMen.setEditable(false);
			txtHijosMen.setFocusable(false);
			txtHijosMen.setBackground(colorDisabled);
		}
	}

	private void generaPanelEstudios(JPanel panelEst) {

		JLabel lblNivel = new JLabel("Nivel m\u00e1ximo: ");
		panelEst.add(lblNivel);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtNivel = new JTextFieldFoco();
			lblNivel.setLabelFor(txtNivel);
			txtNivel.setColumns(10);
			panelEst.add(txtNivel);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbNivel = new JComboBox<String>();
			lblNivel.setLabelFor(cmbNivel);
			cmbNivel.addItem("Sin estudios");
			cmbNivel.addItem("Primaria");
			cmbNivel.addItem("Secundaria");
			cmbNivel.addItem("Bachillerato");
			cmbNivel.addItem("F. P.");
			cmbNivel.addItem("Diplomatura");
			cmbNivel.addItem("Licenciatura");
			cmbNivel.addItem("Superior");
			panelEst.add(cmbNivel);
		}

		JLabel lblEstudio = new JLabel("Estudio: ");
		panelEst.add(lblEstudio);

		txtEstudio = new JTextFieldFoco();
		lblEstudio.setLabelFor(txtEstudio);
		txtEstudio.setColumns(20);
		panelEst.add(txtEstudio);

		JLabel lblCentro = new JLabel("Tipo de centro: ");
		panelEst.add(lblCentro);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtCentro = new JTextFieldFoco();
			lblCentro.setLabelFor(txtCentro);
			txtCentro.setColumns(10);
			panelEst.add(txtCentro);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			cmbCentro = new JComboBox<String>();
			lblCentro.setLabelFor(cmbCentro);
			cmbCentro.addItem("P\u00fablico");
			cmbCentro.addItem("Privado");
			cmbCentro.addItem("Concertado");
			panelEst.add(cmbCentro);
		}

		JLabel lblFin = new JLabel("Fecha de fin: ");
		panelEst.add(lblFin);

		if (modoFormulario == ModoFormSecundario.M_VER) {
			txtFin = new JTextFieldFoco();
			lblFin.setLabelFor(txtFin);
			txtFin.setColumns(10);
			panelEst.add(txtFin);
			txtNivel.setEditable(false);
			txtNivel.setFocusable(false);
			txtNivel.setBackground(colorDisabled);
			txtEstudio.setEditable(false);
			txtEstudio.setFocusable(false);
			txtEstudio.setBackground(colorDisabled);
			txtCentro.setEditable(false);
			txtCentro.setFocusable(false);
			txtCentro.setBackground(colorDisabled);
			txtFin.setEditable(false);
			txtFin.setFocusable(false);
			txtFin.setBackground(colorDisabled);
		} else if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			dateFin = new JYearChooser();
			dateFin.setStartYear(1960);
			dateFin.setEndYear(2020);
			dateFin.adjustWidthToMaximumValue();
			lblFin.setToolTipText("Entre 1960 y 2020.");
			lblFin.setLabelFor(dateFin);
			panelEst.add(dateFin);
		}
	}

	private void generaPanelLog() {
		panelLog.setEditable(false);
		StyleConstants.setBold(attrs, true);
		insertaTextoPanelLog("-------- INFORME DE HECHOS --------", attrs);
		StyleConstants.setBold(attrs, false);
		insertaNuevaLineaPanelLog();
		insertaNuevaLineaPanelLog();

		scrollPane.setViewportView(panelLog);
		getContentPane().add(scrollPane, "1, 5, fill, fill");

		getContentPane().setFocusTraversalPolicy(
				new FocusTraversalOnArray(new Component[] { toolBar,
						panelCentral, panelLog }));
	}

	private void generaPanelModo(JPanel panelConsulta) {
		JPanel panelModo = new JPanel();
		panelModo.setLayout(new FormLayout(new ColumnSpec[] { new ColumnSpec(
				ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("300px", false),
						Sizes.constant("300px", false)), 0) }, new RowSpec[] {
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("30px", false),
						Sizes.constant("30px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("50px", false),
						Sizes.constant("50px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("50px", false),
						Sizes.constant("50px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("50px", false),
						Sizes.constant("50px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("30px", false),
						Sizes.constant("30px", false)), 0) }));
		JLabel lblModo = new JLabel("Modo de inferencia:");
		ButtonGroup grupo = new ButtonGroup();
		rdAuto = new JRadioButton("AUTOM\u00c1TICO");
		rdAuto.setToolTipText("Realiza una consulta de manera autom\u00e1tica.");
		rdAuto.setSelected(true);
		rdAuto.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				setModoConsulta(ModoConsulta.M_AUTO);
				chkResidencia.setEnabled(false);
				btnResidencia.setEnabled(false);
				chkTrabajo.setEnabled(false);
				btnTrabajo.setEnabled(false);
				chkAlimento.setEnabled(false);
				btnAlimento.setEnabled(false);
				chkHigiene.setEnabled(false);
				btnHigiene.setEnabled(false);
				chkPerjudicial.setEnabled(false);
				btnPerjudicial.setEnabled(false);
			}
		});
		rdParam = new JRadioButton("PAR\u00c1METRO");
		rdParam.setToolTipText("<html>Permite elegir los par\u00e1metros gen\u00e9ricos <br/>"
				+ "a tener en cuenta para la inferencia (sin elegir sus valores).</html>");
		rdParam.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				setModoConsulta(ModoConsulta.M_PARAM);
				chkResidencia.setEnabled(true);
				btnResidencia.setEnabled(false);
				chkTrabajo.setEnabled(true);
				btnTrabajo.setEnabled(false);
				chkAlimento.setEnabled(true);
				btnAlimento.setEnabled(false);
				chkHigiene.setEnabled(true);
				btnHigiene.setEnabled(false);
				chkPerjudicial.setEnabled(true);
				btnPerjudicial.setEnabled(false);
			}
		});
		rdParamValor = new JRadioButton("PAR\u00c1METRO - VALOR");
		rdParamValor
				.setToolTipText("<html>Permite elegir los par\u00e1metros (y sus valores)<br/>"
						+ "a tener en cuenta para la inferencia.</html>");
		rdParamValor.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				setModoConsulta(ModoConsulta.M_PARAM_VALOR);
				chkResidencia.setEnabled(true);
				btnResidencia.setEnabled(chkResidencia.isSelected());
				chkTrabajo.setEnabled(true);
				btnTrabajo.setEnabled(chkTrabajo.isSelected());
				chkAlimento.setEnabled(true);
				btnAlimento.setEnabled(chkAlimento.isSelected());
				chkHigiene.setEnabled(true);
				btnHigiene.setEnabled(chkHigiene.isSelected());
				chkPerjudicial.setEnabled(true);
				btnPerjudicial.setEnabled(chkPerjudicial.isSelected());
			}
		});
		grupo.add(rdAuto);
		grupo.add(rdParam);
		grupo.add(rdParamValor);
		panelModo.add(lblModo, "1, 1, center, bottom");
		panelModo.add(rdAuto, "1, 2, left, center");
		panelModo.add(rdParam, "1, 3, left, center");
		panelModo.add(rdParamValor, "1, 4, left, center");

		panelConsulta.add(panelModo, "2, 1, fill, center");
	}

	private void generaPanelParams(JPanel panelConsulta) {
		JPanel panelParams = new JPanel();
		panelParams.setLayout(new FormLayout(new ColumnSpec[] { new ColumnSpec(
				ColumnSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("350px", false),
						Sizes.constant("350px", false)), 0) }, new RowSpec[] {
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("40px", false),
						Sizes.constant("40px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("40px", false),
						Sizes.constant("40px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("40px", false),
						Sizes.constant("40px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("40px", false),
						Sizes.constant("40px", false)), 0),
				new RowSpec(RowSpec.FILL, Sizes.bounded(Sizes.PREFERRED,
						Sizes.constant("40px", false),
						Sizes.constant("40px", false)), 0) }));

		chkResidencia = new JCheckBox("Condiciones de residencia");
		chkResidencia
				.setToolTipText("<html><ul><li>Temperatura media</li><li>Humedad</li>"
						+ "<li>Horas de sol</li><li>Calidad del aire</li>"
						+ "<li>Contaminaci\u00f3n ac\u00fastica</li></ul></html>");
		chkResidencia.setEnabled(false);
		chkResidencia.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if ((((JCheckBox) e.getSource()).isSelected())
						&& (modoConsulta == ModoConsulta.M_PARAM_VALOR)) {
					btnResidencia.setEnabled(true);
				} else {
					btnResidencia.setEnabled(false);
				}
			}
		});
		btnResidencia = new JButton("Editar");
		btnResidencia.setIcon(new ImageIcon(FormSecundario.class
				.getClassLoader().getResource("icono_editar_20x20.png")));
		btnResidencia.setEnabled(false);
		btnResidencia.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.showFormParams(ModoFormParamConsulta.M_RESIDENCIA);
			}
		});

		panelParams.add(chkResidencia, "1, 1, left, center");
		panelParams.add(btnResidencia, "1, 1, right, center");

		chkTrabajo = new JCheckBox("Condiciones de trabajo");
		chkTrabajo
				.setToolTipText("<html><ul><li>Temperatura media</li><li>Humedad</li>"
						+ "<li>Horas de sol</li><li>Calidad del aire</li>"
						+ "<li>Contaminaci\u00f3n ac\u00fastica</li>"
						+ "<li>Vertidos</li><li>Esfuerzo f\u00edsico</li></ul></html>");
		chkTrabajo.setEnabled(false);
		chkTrabajo.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if ((((JCheckBox) e.getSource()).isSelected())
						&& (modoConsulta == ModoConsulta.M_PARAM_VALOR)) {
					btnTrabajo.setEnabled(true);
				} else {
					btnTrabajo.setEnabled(false);
				}
			}
		});
		btnTrabajo = new JButton("Editar");
		btnTrabajo.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
				.getResource("icono_editar_20x20.png")));
		btnTrabajo.setEnabled(false);
		btnTrabajo.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.showFormParams(ModoFormParamConsulta.M_TRABAJO);
			}
		});

		panelParams.add(chkTrabajo, "1, 2, left, center");
		panelParams.add(btnTrabajo, "1, 2, right, center");

		chkAlimento = new JCheckBox("H\u00e1bitos alimenticios");
		chkAlimento
				.setToolTipText("<html><ul><li>Consumo de cereales/f\u00e9culas</li>"
						+ "<li>Consumo de frutas/verduras</li>"
						+ "<li>Consumo de grasas/l\u00edpidos</li>"
						+ "<li>Consumo de carne</li><li>Consumo de pescado</li>"
						+ "<li>Consumo de l\u00e1cteos/huevos</li>"
						+ "<li>Consumo de agua</li>"
						+ "<li>N\u00famero de comidas diarias</li></ul></html>");
		chkAlimento.setEnabled(false);
		chkAlimento.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if ((((JCheckBox) e.getSource()).isSelected())
						&& (modoConsulta == ModoConsulta.M_PARAM_VALOR)) {
					btnAlimento.setEnabled(true);
				} else {
					btnAlimento.setEnabled(false);
				}
			}
		});
		btnAlimento = new JButton("Editar");
		btnAlimento.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
				.getResource("icono_editar_20x20.png")));
		btnAlimento.setEnabled(false);
		btnAlimento.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.showFormParams(ModoFormParamConsulta.M_ALIMENTO);
			}
		});

		panelParams.add(chkAlimento, "1, 3, left, center");
		panelParams.add(btnAlimento, "1, 3, right, center");

		chkHigiene = new JCheckBox("H\u00e1bitos higi\u00e9nicos");
		chkHigiene
				.setToolTipText("<html><ul><li>Higiene corporal</li><li>Higiene bucal</li>"
						+ "<li>Higiene de vestimenta</li><li>Higiene alimentaria</li>"
						+ "<li>Higiene de vivienda</li></ul></html>");
		chkHigiene.setEnabled(false);
		chkHigiene.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if ((((JCheckBox) e.getSource()).isSelected())
						&& (modoConsulta == ModoConsulta.M_PARAM_VALOR)) {
					btnHigiene.setEnabled(true);
				} else {
					btnHigiene.setEnabled(false);
				}
			}
		});
		btnHigiene = new JButton("Editar");
		btnHigiene.setIcon(new ImageIcon(FormSecundario.class.getClassLoader()
				.getResource("icono_editar_20x20.png")));
		btnHigiene.setEnabled(false);
		btnHigiene.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.showFormParams(ModoFormParamConsulta.M_HIGIENE);
			}
		});

		panelParams.add(chkHigiene, "1, 4, left, center");
		panelParams.add(btnHigiene, "1, 4, right, center");

		chkPerjudicial = new JCheckBox("H\u00e1bitos perjudiciales");
		chkPerjudicial
				.setToolTipText("<html><ul><li>T\u00f3xicos</li><li>Sedentarismo</li>"
						+ "<li>Defectos posturales</li><li>Nivel de estr\u00e9s</li>"
						+ "<li>Horas de sue\u00f1o al d\u00eda</li></ul></html>");
		chkPerjudicial.setEnabled(false);
		chkPerjudicial.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if ((((JCheckBox) e.getSource()).isSelected())
						&& (modoConsulta == ModoConsulta.M_PARAM_VALOR)) {
					btnPerjudicial.setEnabled(true);
				} else {
					btnPerjudicial.setEnabled(false);
				}
			}
		});
		btnPerjudicial = new JButton("Editar");
		btnPerjudicial.setIcon(new ImageIcon(FormSecundario.class
				.getClassLoader().getResource("icono_editar_20x20.png")));
		btnPerjudicial.setEnabled(false);
		btnPerjudicial.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.showFormParams(ModoFormParamConsulta.M_PERJUDICIAL);
			}
		});
		panelParams.add(chkPerjudicial, "1, 5, left, center");
		panelParams.add(btnPerjudicial, "1, 5, right, center");

		panelConsulta.add(panelParams, "4, 1, fill, fill");
	}

	private void generaProvincias(JComboBox<String> cmbProvincia) {
		cmbProvincia.addItem("\u00c1lava / Araba");
		cmbProvincia.addItem("Albacete");
		cmbProvincia.addItem("Alicante / Alacant");
		cmbProvincia.addItem("Almer\u00eda");
		cmbProvincia.addItem("Asturias / Asturies");
		cmbProvincia.addItem("\u00c1vila");
		cmbProvincia.addItem("Badajoz");
		cmbProvincia.addItem("Barcelona");
		cmbProvincia.addItem("Burgos");
		cmbProvincia.addItem("C\u00e1ceres");
		cmbProvincia.addItem("C\u00e1diz");
		cmbProvincia.addItem("Cantabria");
		cmbProvincia.addItem("Castell\u00f3n / Castell\u00f2");
		cmbProvincia.addItem("Ceuta");
		cmbProvincia.addItem("Ciudad Real");
		cmbProvincia.addItem("C\u00f3rdoba");
		cmbProvincia.addItem("La Coru\u00f1a / A Coru\u00f1a");
		cmbProvincia.addItem("Cuenca");
		cmbProvincia.addItem("Gerona / Girona");
		cmbProvincia.addItem("Granada");
		cmbProvincia.addItem("Guadalajara");
		cmbProvincia.addItem("Guip\u00fazcoa / Gipuzkoa");
		cmbProvincia.addItem("Huelva");
		cmbProvincia.addItem("Huesca");
		cmbProvincia.addItem("Islas Baleares / Illes Balears");
		cmbProvincia.addItem("Ja\u00e9n");
		cmbProvincia.addItem("Le\u00f3n");
		cmbProvincia.addItem("L\u00e9rida / Lleida");
		cmbProvincia.addItem("Lugo");
		cmbProvincia.addItem("Madrid");
		cmbProvincia.addItem("M\u00e1laga");
		cmbProvincia.addItem("Melilla");
		cmbProvincia.addItem("Murcia");
		cmbProvincia.addItem("Navarra / Nafarroa");
		cmbProvincia.addItem("Orense / Ourense");
		cmbProvincia.addItem("Palencia");
		cmbProvincia.addItem("Las Palmas");
		cmbProvincia.addItem("Pontevedra");
		cmbProvincia.addItem("La Rioja");
		cmbProvincia.addItem("Salamanca");
		cmbProvincia.addItem("Segovia");
		cmbProvincia.addItem("Sevilla");
		cmbProvincia.addItem("Soria");
		cmbProvincia.addItem("Tarragona");
		cmbProvincia.addItem("Tenerife");
		cmbProvincia.addItem("Teruel");
		cmbProvincia.addItem("Toledo");
		cmbProvincia.addItem("Valencia / Val\u00e8ncia");
		cmbProvincia.addItem("Valladolid");
		cmbProvincia.addItem("Vizcaya / Bizkaia");
		cmbProvincia.addItem("Zamora");
		cmbProvincia.addItem("Zaragoza");
	}

	private void generaTabla() {
		tabla = new JTable() {

			private static final long serialVersionUID = 1L;

			@Override
			public Component prepareRenderer(TableCellRenderer renderer,
					int rowIndex, int vColIndex) {
				Component c = super.prepareRenderer(renderer, rowIndex,
						vColIndex);
				if (c instanceof JComponent) {
					JComponent jc = (JComponent) c;
					jc.setToolTipText((String) getValueAt(rowIndex, vColIndex));
				}
				return c;
			}
		};
		tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabla.setFocusable(true);
		tabla.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		tabla.getTableHeader().setReorderingAllowed(false);
		tabla.setAutoCreateRowSorter(false);
		tabla.setFillsViewportHeight(true);

		if ((modoFormulario == ModoFormSecundario.M_EDITAR)
				|| (modoFormulario == ModoFormSecundario.M_NUEVO)) {
			// Popup tabla
			JMenuItem mntmEditar = new JMenuItem("Editar...");
			mntmEditar.setIcon(new ImageIcon(FormSecundario.class
					.getClassLoader().getResource("icono_editar_16x16.png")));
			mntmEditar.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					mntmEditarActionPerformed(e);
				}
			});
			popupMenu.add(mntmEditar);

			JMenuItem mntmEliminar = new JMenuItem("Eliminar");
			mntmEliminar.setIcon(new ImageIcon(FormSecundario.class
					.getClassLoader().getResource("icono_eliminar_16x16.png")));
			mntmEliminar.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					mntmEliminarActionPerformed(e);
				}
			});
			popupMenu.add(mntmEliminar);
		}

		tabla.addKeyListener(new KeyAdapter() {

			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					introTablaActionPerformed(e);
				} else if (e.getKeyCode() == KeyEvent.VK_TAB) {
					tabTablaActionPerformed(e);
				}
			}
		});

		tabla.addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent e) {
				int filaClick = e.getY() / tabla.getRowHeight();
				actualizaSeleccion(filaClick + 1);
				if (!e.isMetaDown()) { // Si es el derecho
					if (e.getClickCount() == 2) {
						dobleClickTablaActionPerformed(e);
					}
				} else {
					botonDerechoTablaActionPerformed(e);
				}
			}
		});

		tabla.addFocusListener(new FocusAdapter() {

			@Override
			public void focusGained(FocusEvent e) {
				if (tabla.getSelectedRowCount() == 0) {
					actualizaSeleccion(1);
				}
			}
		});

		generaTablaHistorial();

		scrollPane.setViewportView(tabla);
		getContentPane().add(scrollPane, "1, 5, fill, fill");

		getContentPane().setFocusTraversalPolicy(
				new FocusTraversalOnArray(new Component[] { toolBar,
						panelCentral, tabla }));
	}

	private void generaTablaHistorial() {
		tabla.setModel(new DefaultTableModel(new String[][] {}, new String[] {
				"Tipo", "Sistema", "Descripci\u00f3n", "Procedencia", "Fecha",
				"Duraci\u00f3n", "Estado" }) {
			private static final long serialVersionUID = 1L;

			boolean[] columnEditable = new boolean[] { false, false, false,
					false, false, false, false };

			@Override
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return columnEditable[columnIndex];
			}
		});

		tabla.getColumnModel().getColumn(0).setMinWidth(75);
		tabla.getColumnModel().getColumn(0).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(1).setMinWidth(75);
		tabla.getColumnModel().getColumn(1).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(2).setMinWidth(75);
		tabla.getColumnModel().getColumn(2).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(3).setMinWidth(75);
		tabla.getColumnModel().getColumn(3).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(4).setMinWidth(75);
		tabla.getColumnModel().getColumn(4).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(5).setMinWidth(75);
		tabla.getColumnModel().getColumn(5).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(6).setMinWidth(75);
		tabla.getColumnModel().getColumn(6).setPreferredWidth(300);
	}

	private void generaTablaHobbies() {
		tabla.setModel(new DefaultTableModel(new String[][] {}, new String[] {
				"Nombre", "Tipo", "Categor\u00eda",
				"Frecuencia semanal (d\u00edas)",
				"Duraci\u00f3n diaria (horas)", "Coste (euros)" }) {
			private static final long serialVersionUID = 1L;

			boolean[] columnEditable = new boolean[] { false, false, false,
					false, false, false };

			@Override
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return columnEditable[columnIndex];
			}
		});

		tabla.getColumnModel().getColumn(0).setMinWidth(75);
		tabla.getColumnModel().getColumn(0).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(1).setMinWidth(75);
		tabla.getColumnModel().getColumn(1).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(2).setMinWidth(75);
		tabla.getColumnModel().getColumn(2).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(3).setMinWidth(75);
		tabla.getColumnModel().getColumn(3).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(4).setMinWidth(75);
		tabla.getColumnModel().getColumn(4).setPreferredWidth(300);
		tabla.getColumnModel().getColumn(5).setMinWidth(75);
		tabla.getColumnModel().getColumn(5).setPreferredWidth(300);
	}

	private void getCodigoHecho() {
		String tipo = StringsHP_BD.tipoHechoBD((String) tabla.getValueAt(
				tabla.getSelectedRow(), 0));
		String sistema = StringsHP_BD.sistemaHechoBD((String) tabla.getValueAt(
				tabla.getSelectedRow(), 1));
		String descripcion = StringsHP_BD.descripcionHechoBD((String) tabla
				.getValueAt(tabla.getSelectedRow(), 2));
		Controlador.codigoHecho = Controlador.obtenerCodigoHecho(tipo, sistema,
				descripcion);
	}

	private Historial getHistoriaTabla() {
		HistorialId id = new HistorialId(Controlador.dni,
				Controlador.codigoHecho);
		Historial h = new Historial();
		h.setId(id);
		h.setHechoClinico(Controlador.obtenerHecho(Controlador.codigoHecho));
		h.setProcedencia((String) tabla.getValueAt(tabla.getSelectedRow(), 3));
		h.setFecha((String) tabla.getValueAt(tabla.getSelectedRow(), 4));
		h.setDuracion(Integer.valueOf((String) tabla.getValueAt(
				tabla.getSelectedRow(), 5)));
		h.setEstado((String) tabla.getValueAt(tabla.getSelectedRow(), 6));
		return h;
	}

	private Hobbie getHobbieTabla() {
		HobbieId id = new HobbieId(Controlador.dni, Controlador.nombreHobbie);
		Hobbie h = new Hobbie();
		h.setId(id);
		h.setTipo((String) tabla.getValueAt(tabla.getSelectedRow(), 1));
		h.setCategoria((String) tabla.getValueAt(tabla.getSelectedRow(), 2));
		h.setFrecuenciaSemanal(Integer.valueOf((String) tabla.getValueAt(
				tabla.getSelectedRow(), 3)));
		h.setDuracion(Integer.valueOf((String) tabla.getValueAt(
				tabla.getSelectedRow(), 4)));
		h.setCosteAnual(Integer.valueOf((String) tabla.getValueAt(
				tabla.getSelectedRow(), 5)));
		return h;
	}

	private void inhabilitaParams() {
		ImageIcon iconoVer = new ImageIcon(FormPrincipal.class.getClassLoader()
				.getResource("icono_ver_20x20.png"));
		rdAuto.setEnabled(false);
		rdParam.setEnabled(false);
		rdParamValor.setEnabled(false);
		chkResidencia.setEnabled(false);
		chkTrabajo.setEnabled(false);
		chkAlimento.setEnabled(false);
		chkHigiene.setEnabled(false);
		chkPerjudicial.setEnabled(false);
		if (modoConsulta == ModoConsulta.M_PARAM_VALOR) {
			btnResidencia.setIcon(iconoVer);
			btnResidencia.setText("Ver");
			btnResidencia.setEnabled(chkResidencia.isSelected());
			btnTrabajo.setIcon(iconoVer);
			btnTrabajo.setText("Ver");
			btnTrabajo.setEnabled(chkTrabajo.isSelected());
			btnAlimento.setIcon(iconoVer);
			btnAlimento.setText("Ver");
			btnAlimento.setEnabled(chkAlimento.isSelected());
			btnHigiene.setIcon(iconoVer);
			btnHigiene.setText("Ver");
			btnHigiene.setEnabled(chkHigiene.isSelected());
			btnPerjudicial.setIcon(iconoVer);
			btnPerjudicial.setText("Ver");
			btnPerjudicial.setEnabled(chkPerjudicial.isSelected());
			Controlador.inhabilitaVistasParams();
		}
	}

	private void init() {

		int x = Controlador.vistaPrincipal.getX();
		int y = Controlador.vistaPrincipal.getY();

		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setLocation(x - 5, y + 30);

		getContentPane().setLayout(
				new FormLayout(new ColumnSpec[] { ColumnSpec
						.decode("990px:grow"), }, new RowSpec[] {
						new RowSpec(RowSpec.CENTER, Sizes.bounded(
								Sizes.PREFERRED, Sizes.constant("28px", false),
								Sizes.constant("28px", false)), 0), // Toolbar
						RowSpec.decode("max(15px;default)"), // Separador
						new RowSpec(RowSpec.CENTER, Sizes.bounded(
								Sizes.PREFERRED,
								Sizes.constant("360px", false),
								Sizes.constant("360px", false)), 0), // Panel
						new RowSpec(RowSpec.CENTER, Sizes.bounded(
								Sizes.PREFERRED, Sizes.constant("15px", false), // Separador
								Sizes.constant("15px", false)), 0),
						new RowSpec(RowSpec.FILL, Sizes.bounded(
								Sizes.PREFERRED,
								Sizes.constant("200px", false),
								Sizes.constant("200px", false)), 0) })); // Scroll

		setResizable(false);
		setTitle(titulo(modoFormulario));
		setSize(ancho, alto);

		// Cierre del JDialog con la tecla ESC
		KeyStroke escape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
		Action escapeAction = new AbstractAction() {
			private static final long serialVersionUID = 1L;

			@Override
			public void actionPerformed(ActionEvent e) {
				Controlador.cierraVistaSecundaria();
			}
		};

		getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
				escape, "ESCAPE");
		getRootPane().getActionMap().put("ESCAPE", escapeAction);

		// Barra de botones
		toolBar.setFocusable(false);
		toolBar.setFloatable(false);
		getContentPane().add(toolBar, "1, 1, fill, top");
		generaBarraBotones();

		// Separador superior
		JSeparator separadorSup = new JSeparator();
		separadorSup.setSize(new Dimension(0, 10));
		separadorSup.setPreferredSize(new Dimension(0, 10));
		separadorSup.setMinimumSize(new Dimension(0, 10));
		separadorSup.setMaximumSize(new Dimension(0, 10));
		getContentPane().add(separadorSup, "1, 2");

		// Panel Central
		generaPanelCentral();
		getContentPane().add(panelCentral, "1, 3, fill, fill");

		generaBarraOpciones();

		// Separador inferior
		JSeparator separadorInf = new JSeparator();
		separadorInf.setSize(new Dimension(0, 10));
		separadorInf.setPreferredSize(new Dimension(0, 10));
		separadorInf.setMinimumSize(new Dimension(0, 10));
		separadorInf.setMaximumSize(new Dimension(0, 10));
		getContentPane().add(separadorInf, "1, 4");

		if (modoFormulario != ModoFormSecundario.M_CONSULTAR) {
			generaTabla();
		} else {
			generaPanelLog();
		}
	}

	private void insertaNuevaLineaPanelLog() {
		try {
			panelLog.getStyledDocument().insertString(
					panelLog.getStyledDocument().getLength(),
					System.getProperty("line.separator"), null);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	}

	private void insertaTextoPanelLog(String texto, SimpleAttributeSet attrs) {
		try {
			panelLog.getStyledDocument().insertString(
					panelLog.getStyledDocument().getLength(), texto, attrs);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	}

	private void introTablaActionPerformed(KeyEvent e) {
		editar();
	}

	private void mntmEditarActionPerformed(ActionEvent e) {
		editar();
	}

	private void mntmEliminarActionPerformed(ActionEvent e) {
		String valorCelda;
		int opcion = ventanaOpcion(ConstantsString.ADVERTENCIA,
				ConstantsString.TITULO_ELIMINAR);
		if (opcion == JOptionPane.YES_OPTION) {
			valorCelda = (String) tabla.getValueAt(tabla.getSelectedRow(), 0);
			if (valorCelda != null) {
				if (modoLista == ModoListaSecundario.L_HOBBIE) {
					Controlador.nombreHobbie = valorCelda;
					eliminaHobbie();
				} else {
					getCodigoHecho();
					eliminaHistoria();
				}
			}
			actualizaTabla();
		}
	}

	private HashMap<String, Object> obtenerDatosCHKAlimenticios(
			HashMap<String, Object> datos) {
		try {
			if (datos_alimenticios != null) {
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.CEREALES,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.CEREALES));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.FRUTAS,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.FRUTAS));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.GRASAS,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.GRASAS));
				datos.put(ConstantsString.VARIABLESINFERENCIA.CARNE,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.CARNE));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.PESCADO,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.PESCADO));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.LACTEOS,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.LACTEOS));
				datos.put(ConstantsString.VARIABLESINFERENCIA.AGUA,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.AGUA));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.COMIDASDIA,
						datos_alimenticios
								.get(ConstantsString.VARIABLESINFERENCIA.COMIDASDIA));
			}
			return datos;
		} catch (Exception e) {
			e.printStackTrace();
			return datos;
		}
	}

	private HashMap<String, Object> obtenerDatosCHKHigienicos(
			HashMap<String, Object> datos) {
		try {
			if (datos_higienicos != null) {
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.CORPORAL,
						datos_higienicos
								.get(ConstantsString.VARIABLESINFERENCIA.CORPORAL));
				datos.put(ConstantsString.VARIABLESINFERENCIA.BUCAL,
						datos_higienicos
								.get(ConstantsString.VARIABLESINFERENCIA.BUCAL));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.VESTIMENTA,
						datos_higienicos
								.get(ConstantsString.VARIABLESINFERENCIA.VESTIMENTA));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.ALIMENTOS,
						datos_higienicos
								.get(ConstantsString.VARIABLESINFERENCIA.ALIMENTOS));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.VIVIENDA,
						datos_higienicos
								.get(ConstantsString.VARIABLESINFERENCIA.VIVIENDA));
			}
			return datos;
		} catch (Exception e) {
			e.printStackTrace();
			return datos;
		}
	}

	private HashMap<String, Object> obtenerDatosCHKPerjudiciales(
			HashMap<String, Object> datos) {
		try {
			if (datos_perjudiciales != null) {
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.TOXICOS,
						datos_perjudiciales
								.get(ConstantsString.VARIABLESINFERENCIA.TOXICOS));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.SEDENTARISMO,
						datos_perjudiciales
								.get(ConstantsString.VARIABLESINFERENCIA.SEDENTARISMO));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.POSTURALES,
						datos_perjudiciales
								.get(ConstantsString.VARIABLESINFERENCIA.POSTURALES));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.ESTRES,
						datos_perjudiciales
								.get(ConstantsString.VARIABLESINFERENCIA.ESTRES));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.SUENYO,
						datos_perjudiciales
								.get(ConstantsString.VARIABLESINFERENCIA.SUENYO));
			}
			return datos;
		} catch (Exception e) {
			e.printStackTrace();
			return datos;
		}
	}

	private HashMap<String, Object> obtenerDatosCHKTrabajo(
			HashMap<String, Object> datos) {
		try {
			if (datos_trabajo != null) {
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_T,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_T));
				datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_T,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.SOL_T));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.HUMEDAD_T,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_T));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.AIRE_T,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.AIRE_T));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.RUIDO_T,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.RUIDO_T));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.VERTIDOS,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.VERTIDOS));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.ESFUERZO,
						datos_trabajo
								.get(ConstantsString.VARIABLESINFERENCIA.ESFUERZO));
			}
			return datos;
		} catch (Exception e) {
			e.printStackTrace();
			return datos;
		}
	}

	private HashMap<String, Object> obtenerDatosResidencia(
			HashMap<String, Object> datos) {
		try {
			if (datos_residencia != null) {
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_R,
						datos_residencia
								.get(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_R));
				datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_R,
						datos_residencia
								.get(ConstantsString.VARIABLESINFERENCIA.SOL_R));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.HUMEDAD_R,
						datos_residencia
								.get(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_R));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.AIRE_R,
						datos_residencia
								.get(ConstantsString.VARIABLESINFERENCIA.AIRE_R));
				datos.put(
						ConstantsString.VARIABLESINFERENCIA.RUIDO_R,
						datos_residencia
								.get(ConstantsString.VARIABLESINFERENCIA.RUIDO_R));
			}
			return datos;
		} catch (Exception e) {
			e.printStackTrace();
			return datos;
		}
	}

	private void randomAlim(HashMap<String, Object> datos) {
		Random rand = new Random();
		datos.put(ConstantsString.VARIABLESINFERENCIA.CEREALES, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.FRUTAS, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.GRASAS, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.CARNE, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.PESCADO, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.LACTEOS, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.AGUA, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.COMIDASDIA,
				rand.nextInt(6));
	}

	private void randomConR(HashMap<String, Object> datos) {
		datos.put(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_R,
				randomTEMP());
		datos.put(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_R, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_R, randomH());
		datos.put(ConstantsString.VARIABLESINFERENCIA.AIRE_R, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.RUIDO_R, randomBMA());
	}

	private void randomConT(HashMap<String, Object> datos) {
		datos.put(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_T,
				randomTEMP());
		datos.put(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_T, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_T, randomH());
		datos.put(ConstantsString.VARIABLESINFERENCIA.AIRE_T, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.RUIDO_T, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.VERTIDOS, randomSN());
		datos.put(ConstantsString.VARIABLESINFERENCIA.ESFUERZO, randomSN());
	}

	private void randomHig(HashMap<String, Object> datos) {
		datos.put(ConstantsString.VARIABLESINFERENCIA.CORPORAL, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.BUCAL, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.VESTIMENTA, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.VIVIENDA, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.ALIMENTOS, randomBMA());
	}

	private void randomPer(HashMap<String, Object> datos) {
		datos.put(ConstantsString.VARIABLESINFERENCIA.TOXICOS, randomT());
		datos.put(ConstantsString.VARIABLESINFERENCIA.SEDENTARISMO, randomSN());
		datos.put(ConstantsString.VARIABLESINFERENCIA.POSTURALES, randomSN());
		datos.put(ConstantsString.VARIABLESINFERENCIA.ESTRES, randomBMA());
		datos.put(ConstantsString.VARIABLESINFERENCIA.SUENYO, randomH());
	}

	private void reiniciaVariables(HashMap<String, Object> datos) {
		datos.put(ConstantsString.VARIABLESINFERENCIA.CEREALES, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.FRUTAS, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.GRASAS, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.CARNE, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.PESCADO, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.LACTEOS, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.AGUA, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.COMIDASDIA, 3);
		datos.put(ConstantsString.VARIABLESINFERENCIA.CORPORAL, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.BUCAL, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.VESTIMENTA, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.VIVIENDA, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.ALIMENTOS, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.TOXICOS, "Ninguno");
		datos.put(ConstantsString.VARIABLESINFERENCIA.SEDENTARISMO, "No");
		datos.put(ConstantsString.VARIABLESINFERENCIA.POSTURALES, "No");
		datos.put(ConstantsString.VARIABLESINFERENCIA.ESTRES, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.SUENYO, 7);
		datos.put(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_R, 24);
		datos.put(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_R, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_R, 10);
		datos.put(ConstantsString.VARIABLESINFERENCIA.AIRE_R, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.RUIDO_R, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.TEMPERATURA_T, 24);
		datos.put(ConstantsString.VARIABLESINFERENCIA.HUMEDAD_T, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.SOL_T, 10);
		datos.put(ConstantsString.VARIABLESINFERENCIA.AIRE_T, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.RUIDO_T, "Medio");
		datos.put(ConstantsString.VARIABLESINFERENCIA.VERTIDOS, "No");
		datos.put(ConstantsString.VARIABLESINFERENCIA.ESFUERZO, "No");
	}

	private void rellenaDatosPersonales() {
		Persona persona = datosCliente.getPersona();
		txtDNI.setText(persona.getDni());
		txtNombre.setText(persona.getNombre());
		txtApellido1.setText(persona.getApellido1());
		txtApellido2.setText(persona.getApellido2());
		txtTelf.setText(persona.getTelefono().toString());
		txtLocalidad.setText(persona.getLocalidad());

		if (persona.getSexo().equals(ConstantsString.HOMBRE)) {
			rdbtnHombre.setSelected(true);
			rdbtnMujer.setSelected(false);
		} else {
			rdbtnHombre.setSelected(false);
			rdbtnMujer.setSelected(true);
		}

		if (modoFormulario.equals(ModoFormSecundario.M_VER)
				|| modoFormulario.equals(ModoFormSecundario.M_CONSULTAR)) {
			txtDNI.setToolTipText(txtDNI.getText());
			txtNombre.setToolTipText(txtNombre.getText());
			txtApellido1.setToolTipText(txtApellido1.getText());
			txtApellido2.setToolTipText(txtApellido2.getText());
			txtTelf.setToolTipText(txtTelf.getText());
			txtLocalidad.setToolTipText(txtLocalidad.getText());
			txtFNac.setText(StringsHP_BD.fechaHP(persona.getFechaNacimiento()));
			txtFNac.setToolTipText(txtFNac.getText());
			txtProvincia.setText(StringsHP_BD.provinciaHP(persona
					.getProvincia()));
			txtProvincia.setToolTipText(txtProvincia.getText());
		} else {
			dateFNac.setDate(persona.getFechaNacimiento());
			cmbProvincia.setSelectedItem(StringsHP_BD.provinciaHP(persona
					.getProvincia()));
		}
	}

	private void tabTablaActionPerformed(KeyEvent e) {
		if (e.getModifiers() == InputEvent.SHIFT_MASK) {
			barraOpciones.getComponent(barraOpciones.getComponentCount() - 1)
					.requestFocusInWindow();
		} else {
			toolBar.getComponent(0).requestFocusInWindow();
		}
		int fila = tabla.getSelectedRow();
		if (fila < 2) {
			actualizaSeleccion(1);
		} else {
			actualizaSeleccion(fila);
		}
	}

	private void tgBtnOpcion1ActionPerformed(ActionEvent e) {
		modoLista = ModoListaSecundario.L_HISTORIAL;
		generaTablaHistorial();
		actualizaTabla();
	}

	private void tgBtnOpcion2ActionPerformed(ActionEvent e) {
		modoLista = ModoListaSecundario.L_HOBBIE;
		generaTablaHobbies();
		actualizaTabla();
	}

	private String titulo(ModoFormSecundario modo) {
		switch (modo) {
		case M_VER:
			return ConstantsString.TITULO_MODO_VER;
		case M_NUEVO:
			return ConstantsString.TITULO_MODO_NUEVO;
		case M_EDITAR:
			return ConstantsString.TITULO_MODO_EDITAR;
		case M_CONSULTAR:
			return ConstantsString.TITULO_MODO_CONSULTAR;
		default:
			return null;
		}
	}
}
